【问题标题】:Where and How are Character array literals created? [duplicate]字符数组文字在哪里以及如何创建? [复制]
【发布时间】:2014-06-15 15:15:44
【问题描述】:

我一直在用 c 中的字符串做实验。 在这段代码中。

#include<stdio.h>
int main()
{
    char *arr="output";
    *arr='s';
    printf("%s",arr);
return 0;
}

字符串“输出”是在内存中的什么位置创建的,并且我们有指针 arr(驻留在堆栈中)最初指向该字符串,为什么不能将其他字符分配给指针? 当我尝试运行这个程序时,我看到了运行时错误信号:11,这是分段错误。

我了解到,在 c++ 中,字符串“输出”是在只读内存中创建的,这会导致在编译过程中“不推荐使用从字符串常量到‘char*’的转换。c 中的行为是什么?

有人能解释一下为什么这会导致分段错误吗?这个字符串“输出”是在哪里创建的。

谢谢。

【问题讨论】:

  • 它与@SteveCox 指出的部分中的代码一起保存。
  • 字符串(有时还有其他)文字将被放置在程序文本部分(只读数据)中。
  • 您可以为指针分配另一个字符串。但这不是你在这里所做的。
  • 在 C99 中更改为 char *arr=(char []){"output"};

标签: c++ c arrays string


【解决方案1】:

这是一个很好的查看资源:https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/

如上所述,主要原因是它是未定义的行为。因为您已经为字符数组分配了空间,第一次调用将值设置为输出。然后你试图用不同的内存空间更新同一个数组。最好释放变量 arr 的内存,然后 malloc 新内存。内存在写完后应该是只读的,写完后应该释放。如果您需要新信息并想重用变量,请为其分配新内存。

【讨论】:

    【解决方案2】:

    字符串“输出”在内存中的哪个位置创建

    数组本身是静态的。未指定是否与其他具有相同内容的字符串字面量数组在同一位置。

    为什么不能为指针分配其他字符?

    这样做会产生未定义的行为。

    谁能解释一下为什么这会导致分段错误?

    许多实现将字符串存储在写保护的内存中,因此如果您尝试这样做,就会出错。请注意,在现代 C++ 中,转换为 char*(而不是 const char*)不仅被弃用,而且被禁止。

    c 中的行为是什么?

    与在 C++ 中一样,尝试修改文字是未定义的行为,并且在这两种语言中都没有指定实现细节。我对 C 有点过时了,所以我不知道这些天是否允许、弃用或禁止狡猾的转换为 char*

    【讨论】:

    • 所有常量字面量(以及由于历史原因在 C 中属于 char[] 类型的字符串字面量)可能会被合并,而与类型无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2014-03-02
    相关资源
    最近更新 更多