|
Что правильнее использовать sizeof или strlen ? | ☑ | ||
---|---|---|---|---|
0
Ковычки
27.04.13
✎
15:06
|
К примеру в конструкции malloc ( sizeof или strlen ) ?
|
|||
1
sdv2000
27.04.13
✎
15:19
|
юзай обе
|
|||
2
sdv2000
27.04.13
✎
15:19
|
неошибёшьси
|
|||
3
Ковычки
27.04.13
✎
15:26
|
sizeof ( char ) * strlen ( x ) ?
|
|||
4
Sidney
27.04.13
✎
15:28
|
Google тебе в помощь
#include <string.h> #include <stdio.h> int main() { const char str[] = "How many characters contains this string?"; printf("without null character: %d\n", strlen(str)); printf("with null character: %d\n", sizeof(str)); return 0; } Output: without null character: 41 with null character: 42 |
|||
5
Ковычки
27.04.13
✎
15:29
|
(4) нульчар не всегда существует
|
|||
6
Sidney
27.04.13
✎
15:32
|
(5)нульчар не всегда существует ГДЕ?
|
|||
7
Бывший адинэсник
27.04.13
✎
15:33
|
(0) sizeof
|
|||
8
Бывший адинэсник
27.04.13
✎
15:42
|
1 #include <string.h>
2 #include <stdio.h> 3 4 int main() 5 { 6 const char str[] = "\0How many characters contains this string?"; 7 8 printf("without null character: %d\n", strlen(str)); 9 printf("with null character: %d\n", sizeof(str)); 10 11 return 0; 12 } darkstar:~$ gcc 1.c -o test darkstar:~$ ./test without null character: 0 with null character: 43 ибо strlen ищет символ '\0' |
|||
9
Chai Nic
27.04.13
✎
15:48
|
Какой кошмар этот ваш Си..
Строка - это же _указатель_ на массив в памяти, но тем не менее sizeof возвращает не размер указателя, а размер массива. Если же этот массив передать в другую функцию - там он станет указателем, и sizeof будет возвращать размер указателя. http://stackoverflow.com/questions/9041102/sizeof-for-a-character-array |
|||
10
Ковычки
27.04.13
✎
15:51
|
(6)
char x [] = "Вася Пупкин"; char * y = ( char * ) malloc ( 8 ); strncpy ( y, x, 8 ); printf ( "%d == %d\n", sizeof ( y ), strlen ( y ) ); ///и ко всему free ( y ); y = ( char * ) malloc ( 4 ); strncpy ( y, x, 4 ); printf ( "%d == %d\n", sizeof ( y ), strlen ( y ) ); |
|||
11
Ковычки
27.04.13
✎
15:53
|
(9) и не забудь о блоках
|
|||
12
Steel_Wheel
27.04.13
✎
16:06
|
(0) sizeof, т.к. strlen тебе уже не нужен
|
|||
13
Steel_Wheel
27.04.13
✎
16:07
|
А хотя... 2 вопроса:
1. Откуда тебе результат для strlen пришел? 2. Под что ты собираешься память аллокейтить? |
|||
14
Torquader
27.04.13
✎
17:14
|
Не стоит забывать, что sizeof если не переопределён для объекта, то вычисляется в момент компиляции кода и записывается числом. strlen же вычисляет длину строки в символах, а не байтах, то есть на данный момент может быть unsigned char или unsigned short
|
|||
15
vde69
27.04.13
✎
18:23
|
(0) если для прямого доступа к памяти, то следует учитывать что malloc может хапнуть больше указанной памяти.
по этому если требуется использовать память в доступном сегменте то достаточно получить указатель на начало и присвоить его своему обьекту, а вот если требуется чужей сегмент смотреть, там все равно хитрости дополнительные есть. я всегда сначала создаю указатель на обьект нужного типа а потом его проецирую на начало памяти и тогда чере5з свой обьект получаю доступ "туду" |
|||
16
Sidney
27.04.13
✎
18:54
|
(8)"\0How many characters contains this string?"
Зачем так делать? |
|||
17
HeroShima
27.04.13
✎
19:14
|
Это еще смотря размер чего.
|
|||
18
Rie
27.04.13
✎
19:30
|
Ну так, для развлечения - strlen("abc\x0def") чему равна (реальная ошибка, на которую довелось напороться).
|
|||
19
HeroShima
27.04.13
✎
20:20
|
(16) А чем "\0" хуже других?
|
|||
20
HeroShima
27.04.13
✎
20:21
|
Паскалевский подход к работе со строками более правильный.
|
|||
21
Rie
27.04.13
✎
20:27
|
(19) У strlen спроси :-)
|
|||
22
Rie
27.04.13
✎
20:28
|
+(21) Это - реальная проблема при передаче данных по OLE.
|
|||
23
Chai Nic
27.04.13
✎
20:31
|
(20) Турбо-борланд-паскалевский тогда уж.. в оригинальном паскале строк вообще не было.. приходилось использовать массив символов.
|
|||
24
HeroShima
27.04.13
✎
20:36
|
(23) Про модулу-2 и оберон почему не сказал?
|
|||
25
HeroShima
27.04.13
✎
20:37
|
(21) я со strlen несогласен! )
|
|||
26
Chai Nic
27.04.13
✎
20:38
|
(25) Си это переносимый ассемблер.. то, что на нем стали писать прикладной софт - большая ошибка всей отрасли, которая до сих пор икается..
|
|||
27
HeroShima
27.04.13
✎
20:40
|
(26) прикладного софта на си уже почти не пишут.
|
|||
28
HeroShima
27.04.13
✎
20:40
|
+(27) к счастию, да
|
|||
29
Rie
27.04.13
✎
20:41
|
(27)Звидзите, батенька :-)
|
|||
30
Rie
27.04.13
✎
20:42
|
(26) А на чём пмсать-то было?
|
|||
31
HeroShima
27.04.13
✎
20:42
|
(29) с++ не с, правда? )
|
|||
32
ДенисЧ
27.04.13
✎
20:42
|
сколько же тут сифобов.... в суд на вас подать, что ли.юю
|
|||
33
ДенисЧ
27.04.13
✎
20:42
|
(31) неправда
|
|||
34
HeroShima
27.04.13
✎
20:43
|
(33) звиздите
|
|||
35
ДенисЧ
27.04.13
✎
20:55
|
(34) идитиауй
|
|||
36
Ковычки
27.04.13
✎
21:02
|
каков результат ?
char * x = ( char * ) malloc ( 1 ); *x = '\0'; и что правильнее в этом случае sizeof или strlen ? |
|||
37
Ковычки
27.04.13
✎
21:04
|
каков будет результат sizeof ( malloc ( 1 ) ) ? и от чего он зависит ?
|
|||
38
HeroShima
27.04.13
✎
21:05
|
(35) аргумент хоть и железный, но сдвинуть можно)
(мне нравится с++, мне легко на нем писать и я себя непринуждённо чувствую в окружении классов, шаблонов и директив препроцессора, stdcall меня побери) |
|||
39
HeroShima
27.04.13
✎
21:06
|
(37) от загруженного хидера
|
|||
40
ДенисЧ
27.04.13
✎
21:07
|
(38) а мне нравится эйфелль, хотя приходится писать на 1с, так что см (35)
|
|||
41
HeroShima
27.04.13
✎
21:08
|
(40) вижу, тебе и (35) нравится)
|
|||
42
Ковычки
27.04.13
✎
21:09
|
(39) какое отношение имеет кучка определений и подстановок к поведению не библиотечного нутра ?
|
|||
43
ДенисЧ
27.04.13
✎
21:09
|
(41) мнен нравится, когда ты делаешь (35)....
|
|||
44
HeroShima
27.04.13
✎
21:11
|
(42) а почему небиблиотечного?
(43) всем не угодишь |
|||
45
Ковычки
27.04.13
✎
21:16
|
попутно
r = write ( fd, &h, sizeof (h) ) дает следующее Syscall param write(buf) points to uninitialised byte(s) at 0x5D318D0: __write_nocancel (syscall-template.S:82) h вполне так определен за 1 строчку до |
|||
46
Rie
27.04.13
✎
21:18
|
(45) Чот ты намудрил. Полностью код приведи.
|
|||
47
Ковычки
27.04.13
✎
21:21
|
(46)
memcpy ( header.magic_num, CACHE_MAGIC_NUM, sizeof(header.magic_num) ); header.version = CACHE_VERSION; header.toc_str_sz = sizeof ( MsgInfoList ); header.modtime = stbuf.st_mtime; header.msg_count = msg_count; header.toc_size = toc_size; header.drop_size = p->drop_size; header.spool_end = p->spool_end; header.eol = '\n'; rslt = write ( cache_fd, &header, sizeof (header) ); |
|||
48
Ковычки
27.04.13
✎
21:22
|
или все 60 штук *.с ?
|
|||
49
Rie
27.04.13
✎
21:26
|
(47) Мля, не вижу проблемы. Ты копируешь фиксированные данные. sizeof тебе даст всё, что надо.
|
|||
50
Ковычки
27.04.13
✎
21:27
|
(49) мене ничего не надо, а вот валгринду надо
Syscall param write(buf) points to uninitialised byte(s) at 0x5D318D0: __write_nocancel (syscall-template.S:82) |
|||
51
Ковычки
27.04.13
✎
21:30
|
да еще - что счас модно вместо strtok ?
|
|||
52
Бывший адинэсник
28.04.13
✎
02:52
|
используй glib не путать с glibc
в глибе многие вещи из того что в принципе может понадобиться есть (массивы, связанные списки, работа с юникодом) при этом эта библиотека стандартно входит во все дистры, даже на эмбедед в принципе её пихают, так что проблем никаких (ну кроме уж совсем урезанных железок) |
|||
53
Ковычки
28.04.13
✎
10:39
|
(52) Вы о чем ?не знаю и знать не желаю, что такое и глиб и глибси
|
|||
54
Torquader
28.04.13
✎
16:42
|
Ребята - какой strlen в OLE.
По описанию, strlen определяет длину строки, заканчивающейся символом ноль, то есть строки в режиме Си. OLE использует строки в стиле BSTR (Basic String) в ней размер строки пишется в начале и позволяет хранить любое число символов (собственно, в паскале и бейсике такой подход проходит). Однако, в системе используются строки, оканчивающиеся нулём. И не надо в этом винить ассемблер - в первых версиях DOS в качестве конца строки использовался символ $. |
|||
55
Ковычки
28.04.13
✎
16:53
|
попутно - чем плохо ?
void xxx ( void ** x ) { } если обращение char * x; ... xxx ( &x); |
|||
56
Torquader
28.04.13
✎
21:11
|
(55) У меня так динамический буфер был реализован - через ссылку на место в памяти, где размещается адрес выделенного буфера - его можно при увеличении просто перемещать.
|
|||
57
Крутил_
Вертел_1С 29.04.13
✎
05:13
|
Strlen - длина строки
SizeOf - объем данных Для измерения длины строки используем StrLen Для измерения сколько данные / переменная занимает в памяти используем SizeOf Тему закрываю |
|||
58
Крутил_
Вертел_1С 29.04.13
✎
06:03
|
(0) ну и конкретно для malloc это SizeOf
|
|||
59
DEVIce
29.04.13
✎
06:26
|
Все очень просто. Если надо посчитать количество символов - то strlen, если объем занимаемой памяти то sizeof. Разница существенная, ибо strlen может не считать всякие переводы строк и прочие невыводимые символы. Плюс, это может быть например юникод, символов два раза меньше, чем занимают памяти.
|
|||
60
Ковычки
29.04.13
✎
17:15
|
(58)(59) ветку и сабж пробовали читать ?
|
|||
61
oleg_km
29.04.13
✎
18:24
|
(59) strlen нельзя применить к юникоду, т.к. у нее параметр типа char*
|
|||
62
oleg_km
29.04.13
✎
18:26
|
+(61) и переводы и прочее она тоже считает. Не считает только \0.
Как-то так: char* cBuf = new char[5]; cBuf[0] = 200; cBuf[1] = 200; cBuf[2] = 0; cBuf[3] = 200; cBuf[4] = 200; sizeof(cBuf) = 5 strlen(cBuf) = 2 |
|||
63
Крутил_
Вертел_1С 30.04.13
✎
01:07
|
(60) да пробовал
(0) Что правильнее использовать, К примеру в конструкции malloc ( sizeof или strlen ) ? (58) ну и конкретно для malloc это SizeOf (60) а ты пробовал не набивать посты и пост модера флудом? |
|||
64
Ковычки
30.04.13
✎
06:48
|
(63) хреново читаешь
|
|||
65
DEVIce
30.04.13
✎
06:50
|
(60) Я что-то не так написал? Или мне надо прочитать тонну авносрача, чтобы выдать истину?
|
|||
66
Ковычки
30.04.13
✎
06:51
|
(65) еще раз внимательно прочтите сабж
|
|||
67
Ковычки
30.04.13
✎
06:52
|
+ ну и (10) и (36) для "осознанья и просветленья"
|
|||
68
DEVIce
30.04.13
✎
06:54
|
(61) Можно, если он перегружен или метод соответствующего класса. Тут не в этом дело, а в том что и как считается, один считает именно количество символов, второй занимаемый объем памяти. Можно конечно помнить все частности в реализации методов (накрена только?), а можно воспользоваться общим принципом, изложенным в предыдущем предложении, и не парить мозг, тем в какой реализации какие символы подсчитывает strlen, а в какой какие не подсчитывает.
|
|||
69
DEVIce
30.04.13
✎
06:55
|
(66) Я прочитал. И? Из моих постов следует, что надо использовать sizeof(). Что тебе не понятно?
|
|||
70
DEVIce
30.04.13
✎
06:56
|
(67) Продолжай и дальше в таком духе программить. Используй для выделения памяти strlen. Потом долго будешь искать какого керена прога падает в неожиданном месте в неожиданное время.
|
|||
71
DEVIce
30.04.13
✎
06:57
|
Я более того скажу. В ДОСовом Борланд Си, можно было даже не выделять память и все работало, до поры до времени. Ой как потом многие окереневали перенося код под винду - программа падала на каждом шагу.
|
|||
72
Ковычки
30.04.13
✎
07:04
|
(70)
char y[] = "1213123x1232133"; char * x = malloc ( 32768 ); x = strrchr ( y, 'x' ); char * z = malloc ( sizeof ( x ) ); strcpy ( z, x ); так предлагаете ? ( все строки могут быть разнесены по функциям |
|||
73
DEVIce
30.04.13
✎
07:07
|
(72) Я никак не предлагаю, я пишу какой метод для чего нужен. Ты на меня ответственность не перекладывай :). Лично мне пофиг, можешь хоть синусом с косинусом пользоваться для определения выделяемого объема памяти.
|
|||
74
Ковычки
30.04.13
✎
07:09
|
(73) вопрос сколько будет выделено в случае strlen + 1 и сколько в случае sizeof в примере (72) ?
|
|||
75
Ковычки
30.04.13
✎
07:09
|
для z
|
|||
76
DEVIce
30.04.13
✎
07:10
|
(74) Мне не хочется отвечать на твои вопросы.
|
|||
77
Ковычки
30.04.13
✎
07:10
|
Ваше право, куле
|
|||
78
Крутил_
Вертел_1С 30.04.13
✎
07:14
|
(77) смысл твоего бессмысленного флуда? Ведь ответ так и так SizeOf.
Ааааа чую чую рвение к модерке да?Набивание постов очевидное |
|||
79
DEVIce
30.04.13
✎
07:22
|
Самый прикол начнется, когда вот из таких измышлений будет выбран вариант strlen и на вход ему попадет расширение класса строки, у которого есть еще куча служебных полей. Вот смехота, то будет в отладке этого чуда. Памяти-то будет выделяться всяко меньше, чем надо. А все от того, что по привычке из ошибочных предположений, выбран неверный метод.
|
|||
80
D_Pavel
30.04.13
✎
07:25
|
(0) Если нужно узнать сколько памяти занимает переменная, то юзай sizeof. А если нужно узнать сколько буковок в строке, юзай strlen.
|
|||
81
Ковычки
30.04.13
✎
07:27
|
дак скока будет в граммах (72) ?
|
|||
82
DEVIce
30.04.13
✎
07:30
|
(80) Да ему это уже толдычат всю ветку. Толку-то?
|
|||
83
Крутил_
Вертел_1С 30.04.13
✎
07:31
|
лол)) тока щас заметил что (81) и есть автор темы, азазаз. Создал тему что бы просто посратся
|
|||
84
D_Pavel
30.04.13
✎
07:34
|
(82) и что, до сих пор не понял разницу? Все лень читать, пробежался по диагонали.
|
|||
85
DEVIce
30.04.13
✎
07:39
|
Кстати, у тебя в строке x = strrchr ( y, 'x' );
разве указатель не стал указывать на другую область памяти? Нафиг ты для него выделял строй выше память? Вообще ест мнение, что уже тут косяк и у тебя утечка памяти пошла ибо от блока, выделенного char * x = malloc ( 32768 ); отцепились все указатели. Авнокодер, задает авновопросы и использует авнометоды. |
|||
86
spock
30.04.13
✎
07:40
|
Мануал:
strlen: http://msdn.microsoft.com/en-us/library/78zh94ax.aspx strrchr: http://msdn.microsoft.com/en-us/library/ftw0heb9.aspx strcpy: http://msdn.microsoft.com/en-us/library/kk6xf663.aspx sizeof: http://msdn.microsoft.com/en-us/library/4s7x1k91(v=vs.110).aspx char * z = malloc ( sizeof ( x ) ); // выделяешь память размером с указатель?? |
|||
87
DEVIce
30.04.13
✎
07:41
|
Т.е. в твоем примере память по х нифига не 32768, а столько, сколько получилось при strrchr ( y, 'x' ), плюс ты поимел утечку памяти в размере 32768.
|
|||
88
Ковычки
30.04.13
✎
07:46
|
(85) не придерайтесь )
пусть так strcpy ( x, strrchr ( y, 'x' ) ); |
|||
89
DEVIce
30.04.13
✎
08:01
|
(88) Да, да. И так во всем.
|
|||
90
Ковычки
30.04.13
✎
17:22
|
Всех с Первомаем и все и так работает на паре сотен почтовых усеров
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |