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

Posted

技术标签:

【中文标题】在 char 指针上使用 strcpy 时程序中止? (在 char 数组上工作正常)【英文标题】:Program aborts when using strcpy on a char pointer? (Works fine on char array) 【发布时间】:2011-08-04 11:52:28 【问题描述】:

我对以下为什么不起作用感到困惑:

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

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

在这两个例子中 strcpy 都收到了一个 char * 但在第一个例子中它死得很惨。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

"abcdef""ddd" 是字符串文字,它们可能位于地址空间的只读部分中。 char s[] = "ddd" 确保此文字被复制到堆栈 - 所以它是可修改的。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于在 char 指针上使用 strcpy 时程序中止? (在 char 数组上工作正常)的主要内容,如果未能解决你的问题,请参考以下文章

strcpy 从整数生成指针而不进行强制转换

为啥指向 char 数组的指针必须需要 strcpy 才能为其数组分配字符而双引号分配不起作用?

strcpy和strcat易忽略点

VS2013 C++中的strcpy用不了,说换成strcpy_s,还是出现错误了。

用C语言程序,通过自定义函数实现字符串处理函数strcat、 strcpy、strcmp、strlen和的功能

野指针相关总结