2014-10-24 3 views
0

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

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 это правильно?

Благодаря

+0

'sizeof (char)' всегда '1', поэтому вы можете просто написать 1. – glglgl

ответ

1

В контексте вашего поста, кажется, что вы действительно хотите, чтобы определить длины строки, содержащейся на переменную, в отличие от размера переменной. 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)); 

если вы хотите хотите calloc 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-битной машине а, это зависит от того, что приложение компилируется: 32bit или 64bit , то есть для 32-битного приложения размер адреса составляет 4 байта, для 64-битного приложения - 8 байтов.

3

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

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

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

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

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

+0

' sizeof' - это всего лишь вещь времени компиляции в C. C - странно. –

+0

Ahh wow damn, 5 часов отладки и, наконец. Благодарю. – umdcoder

3

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

1

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

+1

_размер указателя, который будет иметь 8 байтов в случае 64-разрядных машин_. Не всегда верно. Только если цель для приложения, использующего код, составляет 64 бит. Многие приложения, даже если они построены на 64-битной машине, построены как 32 бит. В этом случае размер адреса (указатель) будет 32 бита или 4 байта. – ryyker

+0

Да, я также имел в виду одну и ту же точку, но не упоминал об этом явно. –