Почему strcpy C не работает с массивами с двойной индексацией?

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

#include <string.h>

static char src[] = "aaa";

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

person confusedDespiteKnowingBetter    schedule 22.02.2011    source источник
comment
Как будет выглядеть память до strcpy? Как это будет выглядеть потом?   -  person Anon.    schedule 22.02.2011
comment
посмотрите, что именно делает strcpy()   -  person Scott M.    schedule 22.02.2011


Ответы (1)


Потому что 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, который можно изменить.

person paxdiablo    schedule 22.02.2011
comment
Тогда почему это работает? #include <string.h> static char src[] = "aaa"; int main() { char* target = "bbbbbbbbbb"; strcpy(target,src); return 0; } - person confusedDespiteKnowingBetter; 22.02.2011
comment
@confused: Если это сработает, то чисто случайно. Это по-прежнему неопределенное поведение, и вы не должны этого делать, так как что угодно может случиться - иногда что-то может заключаться в том, что это просто работает, но переключается на другую систему или компилятор , или флаги компилятора, или даже запуск после 9 вечера или в голубую луну могут привести к сбою кода. Например, этот точный код вызывает ошибку сегментации на моей машине Ubuntu 10.04. - person paxdiablo; 22.02.2011