Имя: Пароль:
IT
 
Что правильнее использовать 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
Всех с Первомаем и все и так работает на паре сотен почтовых усеров
2 + 2 = 3.9999999999999999999999999999999...