【问题标题】:Simple C code works fine on HPUX but segfaults on Linux. Why?简单的 C 代码在 HPUX 上运行良好,但在 Linux 上会出现段错误。为什么?
【发布时间】:2011-07-19 23:28:26
【问题描述】:

我已经很久很久没有做过任何严肃的 C 语言了,希望能得到一个快速的解释。以下代码在 HP/UX 上编译并运行良好。它在 Ubuntu 中的 GCC 4.3.2 上编译时没有任何警告(即使使用 gcc -Wall),但在 Linux 上运行时会出现段错误。

谁能解释一下原因?

#include <stdio.h>

int main() {
    char *people[] = { "Abigail", "Bob" };

   printf("First:  '%s'\n", people[0]);
   printf("Second: '%s'\n", people[1]);

   /* this segfaults on Linux but works OK on HP/UX */
   people[1][0] = 'R';

   printf("First:  '%s'\n",people[0]);

   return(0);
}

【问题讨论】:

    标签: c linux gcc portability hp-ux


    【解决方案1】:

    您的人员数组实际上是char const *people[]。在许多系统上,文字字符串通常位于只读内存中。你不能给他们写信。显然,在 HP/UX 上并非如此。

    【讨论】:

    • 哦。今晚我会带着我的 K&R 书蜷缩起来!
    • @Rudy:从​​技术上讲,字符串文字只有char *,而不是const。大多数编译器将它们放在只读段中,因此尝试写入它们会导致段错误。有些编译器允许这种不良行为,并且它可能会在共享字符串文字方面产生巨大的问题。在这种情况下,最好将people 定义为char const *,这会在尝试写入people[1][0] 时生成编译时警告/错误。
    • @Tom 我认为字符串文字的常量是一个实现细节。 K&R 不太可能对这个话题有所了解。您可能会在 gcc 手册中找到一些信息。我相信旧版本的 gcc 甚至可以让您使用编译时选项(-fwritable-strings)选择您想要的行为。
    【解决方案2】:

    字符串文字位于只读数据段中。尝试写入它们是违反分段的。

    【讨论】:

      【解决方案3】:

      您不能修改字符串文字。

      【讨论】:

      • 如果内存分割允许,你可以做任何你想做的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      相关资源
      最近更新 更多