9

我很困惑为什么以下内容不起作用:

char * f = "abcdef";
strcpy(f, "abcdef");
printf("%s",f);

char s[] = "ddd";
strcpy(&s[0], "eee");
printf("%s", s);

在这两个示例中,strcpy 都收到了一个 char *,但在第一个示例中,它死于可怕的死亡。

4

6 回答 6

11

"abcdef"并且"ddd"是可能驻留在地址空间的只读部分中的字符串文字。char s[] = "ddd"确保这个文字被复制到堆栈 - 所以它是可修改的。

于 2011-04-13T07:46:55.457 回答
6

char * f = "abcdef";定义了一个指向“abcdef”的字符指针,它位于只读区域,所以你不能写到这个地方

char s[] = "ddd";在堆栈上定义一个可写的 char 数组。

于 2011-04-13T07:48:01.953 回答
5

在第一个示例中,您有一个指向字符串文字的指针。这个指针实际上应该是const char *,因为任何修改字符串文字的尝试都是未定义的行为。但是,出于遗留原因,您可以使用 achar *指向它。但是您仍然不应该尝试修改它。

在第二个版本中,您有一个沼泽标准数组,其内容恰好被初始化为等同于您的字符串。这是可修改的,因为它是您的数组。

于 2011-04-13T07:46:28.087 回答
4

第一个例子是char *一个字符文字(文字是"something")。字符文字是只读的,尝试写入它们可能会导致崩溃。你的第一个指针真的应该是const char *f = "abcdef";,这strcpy不会。

于 2011-04-13T07:46:23.613 回答
2

该语句char * f = "abcdef"将内存中的一个点分配给文字字符串“abcdef”,但是它会拒绝让您修改其内容,直到内存被动态分配 - 它等效于const char.
您所做的只是在内存中创建一个指针,然后写入接下来的 6 个字节,这在 C 中是非法的。

于 2011-04-13T07:47:13.967 回答
2

大多数编译器认为字符串文字是只读的,因此它们所在的内存可以标记为只读,从而导致运行时错误。

要使其工作,请执行以下操作:

char * f = strdup("abcdef");
strcpy(f, "abcdef");
printf("%s",f);
free(f);

这会在堆内存中创建一个可修改的字符串副本,当然需要在程序结束时将其释放。

于 2011-04-13T07:48:25.733 回答