Почему мой calloc не может обнулить все? - PullRequest
0 голосов
/ 12 июня 2011

Я определил следующую функцию, где List - это структура.

List * LIST_Create()
{
  List * l = calloc(0, sizeof(List));
  unsigned char * pc = (unsigned char *)l;  
  for(i = 0; i < sizeof(List); i++)
  {
    LOG("LIST","0x%1x ", (unsigned char)*pc);
    pc++;
  }
}

Когда я распечатываю байты, я получаю это:

LIST: 0xffffffbf 
LIST: 0x1 
LIST: 0x13 
LIST: 0x0 
LIST: 0x1 
LIST: 0x1 
LIST: 0x0 
LIST: 0x0 
LIST: 0x0 
LIST: 0x0 
LIST: 0x0 
LIST: 0x5 

что происходит? Я знаю, что проблема не в печати, потому что код также читает ненулевые значения. Единственный способ, которым я могу надежно обнулить структуру списка, - это инициализация всех членов по отдельности. Я не против, но не должен calloc() работать?

Ответы [ 5 ]

6 голосов
/ 12 июня 2011

Вы выделили достаточно места для 0 List с:

List * l = calloc(0, sizeof(List));

Поэтому ваша выделенная память имеет длину 0 байт.

3 голосов
/ 12 июня 2011

calloc(0, sizeof(List)) выделяет буфер 0 длины;вы печатаете случайные данные после создания «фиктивного» указателя, чтобы вы могли realloc() это позже.Параметры calloc - это количество элементов и размер одного элемента;это облегчает выделение, скажем, вектора 5 (struct foo) с.

2 голосов
/ 12 июня 2011

В руководстве написано:

   calloc()  allocates memory for an array of nmemb elements of size bytes
   each and returns a pointer to the allocated memory.  The memory is  set
   to  zero.  If nmemb or size is 0, then calloc() returns either NULL, or
   a unique pointer value that can later be successfully passed to free().

Ваш функциональный вызов List * l = calloc(0, sizeof(List));

Поэтому у вас есть адрес блока памяти длиной 0 или NULL inl.(Возможно, вы перепутали с memset?)

1 голос
/ 12 июня 2011

Вы звоните calloc с 0 элементами (без элементов). Вы должны по крайней мере пройти 1:

List* l = calloc(1,sizeof(List));
1 голос
/ 12 июня 2011

Вы запрашиваете распределение нулевых байтов.Размер, выделенный calloc, равен nmemb*size, и у вас есть nmemb == 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...