Почему strcpy C терпит неудачу с дважды индексированными массивами? - PullRequest
3 голосов
/ 22 февраля 2011

Следующий код выглядит как segfault, и я не могу понять, почему.

#include <string.h>

static char src[] = "aaa";

int main()
{
   char* target[2] = {"cccc","bbbbbbbbbb"};
   strcpy(target[1],src);
   return 0;
}

1 Ответ

11 голосов
/ 22 февраля 2011

Поскольку target[1] является указателем на "bbbbbbbbbb", и вам не разрешено изменять строковые константы.Это неопределенное поведение.

Это ничем не отличается от:

char *x = "bbb";
x[0] = 'a';

Я думаю, вы можете спутать его с:

char x[] = "bbb";
x[0] = 'a';

, который является действительным, поскольку он создает массив, который вам разрешено изменять.Но вот что дает вам:

char* target[2] = {"cccc","bbbbbbbbbb"};

- это массив указателей, каждый из которых указывает на неизменяемую память.

Если вы попытаетесь:

char t0[] = "cccc";
char t1[] = "bbbbbbbbbb";
char* target[2] = {t0, t1};
strcpy(target[1],src);

вы обнаружите, что он работает, поскольку target[1] теперь указывает на t1, который можно изменять.

...