2014-11-07 1 views
2
int main() 
{ 
    char *a1[10] = {"123","121"}; 
    int i =0; 
    char *a=NULL; 
    for(i=0;i<2;i++) 
    { 
     a=strcat(a1[i],"0000"); 
     printf("values %s",a); 

    } 
} 

Выход этого кода выходит, чтобы быть этим $ ./a.exe значения от 1230000 значений 0000000Значение Не печатается прямо на второй элемент массива

, но это должно быть $ ./a. ехе значения 1230000 значения 1210000

Пожалуйста, скажите мне, где я неправильно

+0

Значения «123» и «121» расположены в памяти вместе ('1', '2', '3', '\ 0', '1', '2', '1', ' \ 0'). На первой итерации вы написали «0000» от первого «\ 0», в результате получились «1», «2», «3», «0», «0», «0», «0», 0 '. На второй итерации вы написали «0000» из позиции, где была вторая «\ 0», в результате «1», «2», «3», «0», «0», «0», , '0', '0', '0', '0', '0', '\ 0' Поэтому вы записали за пределами исходных позиций памяти, выделенных этим строкам. Вы запрограммировали классическое переполнение буфера. можно использовать в качестве примера, чтобы научить, как не программа – Jdamian

+0

@Jdamian, нет переполнения буфера, это ошибка сегментации. –

+0

@djrocktarun, сообщает ли ваша программа ошибку ошибки сегментации? – Jdamian

ответ

6

Вы хотите массив массив char, но char *a1[10] представляет собой массив указателей на char (типично помещенный в сегменты только для чтения/строковые литералы), попытка изменить строковый литерал обычно приводит к ошибке сегментации.

Изменить

char *a1[10] = {"123","121"}; /* Array of string literals (read only) */ 

в

char a1[][10] = {"123","121"}; /* Array of array of char (read - write) */ 
3

Проблема заключается в том не действительно модификация строки litterals. Но линия

char *a1[10]; 

влияет на массив 10 char * и не указатель на массив char[10], что я полагаю OP ожидал (как отмечено в Jdamian комментарии).

Чтобы создать массив char[10], вы должны написать:

char a1[][10] = {"123","121"}; 

Таким образом, вы создаете массив из 2 char[10] инициализированному соответственно "123" (на самом деле, { '1', '2, '3, '\0', '\0', '\0', '\0', '\0', '\0', '\0'} как это действительноchar[10]) и "121";

Таким образом, вы можете смело strcat"0000" к a1[i], потому что 3 (начальная длина) + 4 (добавлено длина) + 1 (нуль-терминатор) дает 8 < = 10.

Но действительно безопасный путь будет:

a=strncat(a1[i],"0000", sizeof(a1[0]) - strlen(a1[i]) - 1); 
+1

Я думаю, что 'sizeof (a1 [0] - strlen (a1) -1)' должен быть 'sizeof (a1 [0]) - strlen (a1) -1' – mch

+0

@mch Oups, я не набрал то, что думал :-(Спасибо, что заметили это (и была еще одна ошибка: a1 -> a1 [i]) –

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