2013-09-17 3 views
1

если вы указали указатель на кусок памяти, который вы просто malloc() и подаете символы в позиции [0], [1], [2], [3], .. ., [n] malloc уже предоставляет нулевой ограничитель '\ 0' в конце или должен предоставить его в последнем элементе массива char?mallocing char и нулевой ограничитель

int i; 
char B; //has the characters hello 
char *A=malloc(5*sizeof(char)); //4 bytes for hello + 1 byte for null terminator? 
for(i=0; i<strlen(A);i++) 
A[i]=B[i]; 

после того, как для отделки цикла я должен добавить нулевой терминатор к последнему элементу A или же таНос() уже обеспечивают его?

+0

Одиночный символ 'char B;' не может содержать 'hello'. У вас может быть символ 'char B [] =" hello ";'. –

+0

Вызов 'strlen (A)' вызывает неопределенное поведение, по крайней мере, для доступа к неинициализированной памяти. – alk

ответ

1

ДА Вам необходимо явно указать нулевой ограничитель. malloc просто возвращает начальный указатель на блок из 5-байтовой памяти.

+0

в случае strcpy() он скопировал бы нулевой ограничитель? Также, если я инициализирую char для чего-то вроде: char A [4] = "hello"; – user2778481

+0

'A [4] =" hello' - переполнение буфера. Вам нужно пространство для терминатора с 5 символами + '\ 0', и да 'strcpy' также скопирует нулевой ограничитель. –

1

После malloc, A содержит значение мусора, поэтому вам необходимо назначить \0 явно. Тем не менее, есть несколько других ошибок в коде:

Ваша декларация B неправильно, он должен быть char массива вместо одного char.

Строка "hello" содержит 6 элементов, в том числе задней \0, так что:

char B[] = "hello"; 
char *A = malloc(strlen(B) + 1); 
for(i = 0; i < strlen(B) + 1; i++) 
    A[i] = B[i]; 

Или вы можете просто использовать strcpy:

strcpy(A, B); 
0

Malloc не обеспечит память, заполненную нулями.

Как указано выше, используйте strcpy и будьте в безопасности.

Я отредактировал часть calloc. Это было неправильно.

+0

Должен ли я предоставить 1 байт для него, когда i malloc? Я читал, что нулевой терминатор находится за пределами области памяти, в которую я могу назначить символы. – user2778481

+1

Вам всегда нужно предоставить один дополнительный байт для нулевого символа, чтобы правильно закончить ваши строки. – NotAgain

Смежные вопросы