Intereting Posts

Как вызывать calloc () 25 байт точно

Я хочу точно указать 25 байт памяти. В этом случае msg_len = 5 байтов, так как это то, что вводится. Это код, который у меня есть:

int full_msg_size = 20 + msg_len; printf("full_msg_size: %d\n", full_msg_size); void *full_msg = calloc(full_msg_size, sizeof(char)); printf("size of full_msg: %d\n", (int*)sizeof(full_msg)); 

Вот что печатает:

full_msg_size: 25 размер full_msg: 8

Но я хочу, чтобы размер full_msg равнялся 25 байтам, как full_msg_size.

Я также хочу, чтобы все пространства памяти были инициализированы нулем.

Может ли кто-нибудь сказать мне, как правильно вызвать calloc / malloc?

Спасибо

В контексте вашего сообщения кажется, что вы действительно хотите определить длину строки, содержащейся в переменной, в отличие от размера переменной. sizeof при применении к указателю, укажет размер адреса, а не длину строки. Если вам нужно определить длину строки во время выполнения, используйте функцию strlen :

 `int len = strlen(some_str)` 

Вы можете получить full_msg_size: 25 размер full_msg: 8, потому что sizeof
возвращает размер адреса full_msg .

Итак, ваша функция:

 printf("size of full_msg: %d\n", (int*)sizeof(full_msg)); 

Должно быть:

 printf("length of full_msg: %d\n", strlen(full_msg)); 

если вы хотите точно указать 25 байт памяти :

 char *full_msg = {0}; full_msg = calloc(25, 1); //all space initialized to 0 //or you can also use: full_msg = malloc(25); 

full_msg теперь имеет память для ровно 25 байт (но нужно использовать для ‘\ 0’)

Оператор sizeof при использовании на char *str возвращает вам размер char * , который является всего лишь адресом.

Примечание . Размер адреса (или указателя) не всегда будет 8 байтов только потому, что вы используете 64-битную машину , это зависит от того, что приложение скомпилировано: 32 бит или 64 бит. т.е. для 32-разрядного приложения размер адреса составляет 4 байта, для 64-битного приложения – 8 байтов.

Вы, скорее всего, выделяете правильное количество байтов, но вы спрашиваете, насколько велик указатель на пустоту. И в 64-битном поле это, скорее всего, будет 8 байтов. Если ему не удалось выделить объем памяти, который вы попросили, тогда full_message будет иметь значение NULL.

Оператор sizeof (почти всегда) оператор времени компиляции (исключение: VLA s). Поэтому sizeof некоторого указателя всегда один и тот же (на вашем компьютере он всегда 8) и не зависит от размера, переданного некоторой функции malloc или calloc .

Учитывая указатель malloc -ed или calloc -ed, нет портативного способа узнать размер, запрошенный при его времени выделения. Вы должны хранить этот размер где-нибудь! Вы можете использовать гибкий член массива, как здесь, если хотите сохранить этот динамический размер внутри выделенной структуры. Вы часто держите размер в другом месте, например, в некоторой переменной ( full_msg_size в вашем случае).

Итак, ваш calloc работает (BTW, вы должны проверить его на отказ).

 void *full_msg = calloc(full_msg_size, 1); if (!full_msg) {perror("calloc"); exit(EXIT_FAILURE); }; 

Но вы не можете использовать sizeof для вычисления размера времени выполнения выделенной зоны.

Вы печатаете размер указателя, который будет иметь 8 байтов в случае 64-битных машин.