程序在char指针上使用strcpy时中止? (在char数组上正常工作)

时间:2011-04-13 07:43:40

标签: c strcpy

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

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

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

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

8 个答案:

答案 0 :(得分:11)

"abcdef""ddd"是字符串文字,可能位于地址空间的只读部分。 <{1}}确保将此文字复制到堆栈 - 因此可以修改。

答案 1 :(得分:6)

char * f = "abcdef";定义了一个指向“abcdef”的char指针,该指针位于只读区域,因此您无法写入此位置

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

语句char * f = "abcdef"在内存中为文字字符串“abcdef”指定一个点,但是在动态分配内存之前它会拒绝让你修改它的内容 - 它等同于const char
您所做的只是在内存中创建一个指针,然后在接下来的6个字节上写入,这在C中是非法的。

答案 5 :(得分:2)

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

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

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

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

答案 6 :(得分:0)

您,请参阅this

链接,关于如何将strcpy用于char指针。

答案 7 :(得分:0)