С памятью вопрос - PullRequest
       4

С памятью вопрос

2 голосов
/ 22 августа 2011
char buffer[10];
strcat(buffer, "hi");
printf("%s", buffer);

В приведенном выше коде он печатает какой-то странный символ или число, за которым следует «привет», я знаю, что strcat добавляется в буфер. И я обычно обнуляю память в буфере. Но мне любопытно, почему я обычно это делаю.

Если я делаю printf("%i", buffer); без strcat, он просто печатает случайное число. Что это за номер? Может ли кто-нибудь объяснить или дать ссылку на паспорт, в котором объясняется, что находится в буфере, прежде чем я что-нибудь напишу?

Ответы [ 5 ]

4 голосов
/ 22 августа 2011

«буфер» - это 10-байтовая область в стеке, и она будет содержать все, что было в последний раз записано в эту область памяти. Когда вы запускаете strcat, он объединяет «hi» после первого нулевого байта в этой области (поэтому, если первый нулевой байт превышает 10 байтов, вы перезаписываете что-то в стеке). Когда вы печатаете без обнуления, он будет печатать байты до первого 0 (ноль). Опять же, это может вывести за пределы 10 байтов.

Когда вы печатаете f (% I, буфер), вы печатаете адрес этого местоположения.

3 голосов
/ 22 августа 2011

Сначала вам нужно инициализировать буфер с нуля:

char buffer[10] = {0};
buffer[0] = 0; /* As R.. points out, initializing all elements is excessive. */

Во-вторых, число является адресом buffer в виде десятичной дроби. Если вы действительно хотите напечатать это, вам лучше печатать:

printf("%p\n", buffer);
2 голосов
/ 22 августа 2011

Вам нужно завершить '\ 0', чтобы отметить конец строки, используйте

strcpy(buffer,"hi");

strcat () пытается добавить к уже существующей строке, которая считается завершенной '\ 0',Ваш буфер не инициализирован.

1 голос
/ 22 августа 2011

сначала выполните memset(buffer, 0, 10), чтобы обнулить память перед добавлением.

0 голосов
/ 22 августа 2011

Функция strcat () добавляет строку src к dest строка, перезаписывающая нулевой байт ('\ 0') в конце dest, и затем добавляет завершающий нулевой байт. Строки не могут перекрытия, и строка dest должна иметь достаточно места для результат.

buffer не '\0' завершено, так как оно не инициализировано, мы не знаем, что оно содержит. Поэтому это неопределенное поведение. Сначала вы должны убедиться, что буфер '\ 0' завершен.

И напечатанное число не случайное число, это начальный адрес буфера.

...