Мне нужно вызвать memset после того, как я выделил новую память, используя malloc

#include "stdlib.h" #include "stdio.h" #include "string.h" int main(int argc, char* argv[]) { int *test = malloc(15 * sizeof(int)); for(int i = 0;i < 15 ;i ++ ) printf("test is %i\n",test[i]); memset(test,0,sizeof(int) * 15); for(int i = 0 ; i < 15; i ++ ) printf("test after memset is %i\n",test[i]); return 0; } 

Выход, который я получаю, очень странный:

  test is 1142126264 test is 32526 ... test is 1701409394 test is 1869348978 test is 1694498930 test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 ... test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 test after memset is 0 

Почему это произойдет? Я думал, что я просто malloc новую новую память, которая готова к использованию?

Итак, как насчет этого:

 int test[15]; 

Должен ли я называть memset(&test,0,sizeof(int) * 15); ?

malloc не инициализирует память, которую он выделяет. Вы просто получаете то, что было там, где был случайный мусор. Если вам действительно нужно, чтобы все было в 0, используйте calloc при штрафе за производительность. (Если вам нужно инициализировать что-то, отличное от 0, используйте memset для байтовых массивов и, иначе, вручную зациклируйте массив, чтобы инициализировать его.)

Когда вы запрашиваете память из кучи, куча будет просто выделять любой ansible ей блок памяти. Этот блок памяти может иметь некоторые данные в зависимости от предыдущей записи.

C11 7.22.3.4

 void *malloc(size_t size); 

Функция malloc выделяет пространство для объекта, размер которого задается по размеру и значение которого неопределенно.

Если вы хотите, чтобы значения были установлены на ноль, вместо этого используйте calloc . calloc – это в основном просто оберточная функция вокруг одного вызова в malloc и один вызов memset (со значением для установки 0).

По соображениям производительности malloc () не дает никаких гарантий относительно содержимого вновь выделенной памяти. Это могут быть нули, это могут быть случайные данные, это может быть что угодно. Если вы хотите, чтобы память malloc’а имела определенное значение, то это зависит от вас.