【问题标题】:Segmentation Fault related to Pointer in c [duplicate]与c中的指针相关的分段错误[重复]
【发布时间】:2013-08-22 19:37:10
【问题描述】:
int main()
{
        char *s="Hello";
        *s="World";
        printf("%s\n",s);
}

为什么上面的程序会导致分段错误?

【问题讨论】:

  • 在我的机器上它甚至无法编译
  • 如果您在 GCC 中,请尝试使用警告标志进行编译,例如 -Wall。这会给你线索。
  • 除了试图覆盖字符串字面量之外,在没有对其进行可变参数声明的情况下调用可变参数函数也是错误的。
  • 你为什么要重新发布完全相同的问题?
  • 不要再这样问重复了。实际上,你现在不能......

标签: c


【解决方案1】:
int main()
{
    char *s="Hello"; // makes 's' point to a constant
    *s="World";      // modifies what 's' points to
    printf("%s\n",s);
}

第一行代码使s 指向一个常量。第二行尝试修改s 指向的内容。所以你试图修改一个常量,你不能这样做,因为一个常量是……好吧……常量。

【讨论】:

    【解决方案2】:

    因为*schar 而不是char*(字符串)

    【讨论】:

    • 这与悬空指针有关吗??
    【解决方案3】:
    char *s="Hello";
    

    声明一个指向字符串文字"Hello"的指针。这可能存在于只读内存中,所以行

    *s="World";
    

    is 导致未定义的行为。崩溃是未定义行为的有效(且有用)形式。

    以下任何一种都可以使用

    const char* s = "Hello";
    s="World";
    printf("%s\n",s);
    
    char s[16] = "Hello";
    strcpy(s, "World";)
    printf("%s\n",s);
    

    【讨论】:

    • 这里的问题不是*schar,而不是字符串吗?
    • 这会在编译时导致警告/错误。运行时的段错误将来自尝试将(不同字符串文字的地址)写入s 指向的只读位置指针。
    【解决方案4】:

    s 在创建时指向静态(全局)内存。您不能在运行时重新分配给该内存,因此会导致崩溃。

    【讨论】:

    • 你能多解释一下内存吗???
    • 编译器为这种静态分配的字符串留出特殊的内存位置。当您调用*s = "another string" 时,您正在尝试访问可能是只读的内存。在这种情况下,行为未定义。
    • @edtheprogrammerguy 我们可以重新分配,但不能重写。
    • 不过,你可以说s = "another string"
    • 你的意思是静态内存为只读内存???
    【解决方案5】:

    *s 是字符串的第一个字符,因此将字符串分配给字符会出错。

    如果你想分配字符串,请使用s = "world"

    int main()
    {
        char *s="Hello";
        s="World";
        printf("%s\n",s);
    }
    

    现在试试吧。

    char *s="hello"; 这里s 位于只读位置。所以我们可以分配另一个字符串,但不能重写新字符串。

    s = "hello"; //work
    strcpy(s, "hello"); //segmentation fault
    

    【讨论】:

      【解决方案6】:

      这里有两个问题。

      声明

      *s = "World";
      

      取消引用 s,它为您提供字符串"Hello"'H' 的第一个字符。因此,您尝试将指针值(字符串“World”的地址)分配给单个 char 对象("Hello" 字符串文字的第一个字符)。

      但是……

      在某些系统上(显然是您的系统),字符串文字存储在只读数据段中,尝试修改只读内存将导致某些系统出现运行时错误。因此崩溃了。

      要将 s 更改为 point 为“World”字符串文字,只需删除取消引用:

      s = "World";
      

      【讨论】:

        【解决方案7】:

        *s 与 s[0] 相同。 s[0] 有空间存储单个字符;在本例中为“W”。

        该角色中没有空间存储“世界”的位置。

        这就是您遇到分段错误的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-25
          • 2017-07-23
          • 2013-09-18
          相关资源
          最近更新 更多