Мне просто повезло, что malloc вернул заполненный нулями буфер? - PullRequest
2 голосов
/ 18 сентября 2011

Я попытался запустить приведенный ниже код:

int main(){
char *ptr = (char*)malloc(sizeof(char)*20);
ptr[5] = 'W';
ptr[0] = 'H';
std::cout<<ptr<<std::endl;
return 0;
} 

Когда я использую GCC 4.3.4 и получаю «H» в качестве вывода.В книге C Programming Language , написанной Kernighan & Ritchie, сказано, что malloc () возвращает неинициализированное пространство, и в этом случае выходные данные должны были иметь некое неопределенное значение.Является ли мой вывод просто результатом совпадения ptr [1] с '\ 0'?

Ответы [ 4 ]

3 голосов
/ 18 сентября 2011

Да, это просто совпадение. Не надейся на это.

2 голосов
/ 18 сентября 2011

Это может быть совпадением, или это может быть особенностью распределителя памяти вашей конкретной системы, это, конечно, не требование языка или библиотеки для инициализации динамически распределенной памяти.

Не путайте недетерминированный с random , даже если память неинициализирована, вероятность того, что этот байт равен нулю, вероятно, намного больше, чем 1/256 из-за типичной шаблоны использования памяти. Например, откройте окно памяти в вашем отладчике на ptr и прокрутите смежную память в любом направлении, скорее всего, вы увидите ноль довольно много.

1 голос
/ 18 сентября 2011

Это зависит от платформы (и режима компиляции), например, в отладочной компиляции может быть заполнен какой-то шаблон, такой как 0x55 0xaa 0x55, в рабочей среде вы можете получить 0x00 с или любой мусор памяти.Так что да, вы можете объявить это совпадением.Вы можете легко получить ошибку шины (или неверный доступ к памяти), поскольку ваша строка не всегда завершается.

0 голосов
/ 18 сентября 2011

Да.Но будьте осторожны в терминологии, ptr [1] - это int 0, а не указатель.

...