【问题标题】:When do segfaults occur?什么时候发生段错误?
【发布时间】:2014-06-23 07:13:28
【问题描述】:

我有以下代码:

char* str = "01248";
printf("%x \n", str[str[1] + str[3]]);

作为str[1]+str[3] = 101,代码查找str [101]

这段代码会(总是)出现分段错误吗? 或者我们在这个地址有一些东西,我们会打印一些东西?

【问题讨论】:

标签: c segmentation-fault


【解决方案1】:

这将始终调用未定义的行为。

您的索引超出范围,如果没有未定义的行为,您将无法做到这一点。

究竟会发生什么,等待它,未定义。它可能会导致段错误,可能根本没有问题,并且可能会打印一些值,您只是不知道。

即使没有发生任何“坏”并且打印了一些值,程序仍然有故障和损坏。

当然,这和只是没有区别

printf("%x\n", str[101]);  /* BAD CODE! */

通过添加两个有效的取消引用来计算无效数组索引的事实并不重要,这只是一个额外的混乱层。此外,您无法“知道”1 + 4 是任何特定的数值,这取决于目标机器的字符编码。在 ASCII 中,它将是 49 + 52,即 101。你甚至不知道 '1' + '4'正数

【讨论】:

  • 如果你不能知道 1 + 4 是否为正,你可能是个 C 程序员 :-)
  • @KerrekSB 哎呀,我丢失了单引号,这比我的意思更令人困惑。谢谢。
【解决方案2】:

这段代码会(总是)出现分段错误吗?

没有。

字符串文字位于一个特殊的 rodata 部分,其中包含所有其他字符串文字,可能还有其他只读数据(尽管我不知道这些可能是什么)。

这取决于数据在该段中的排列方式。如果这个字符串后面跟着长度至少为 100 字节的其他字符串,它可能会成功,您将访问另一个字符串。但是,如果它是该段中的最后一个,您将在分配的任何地址之外找到一个地址并获得段错误。

尽管如此,这是未定义的行为,您不应依赖它。在有疑问的情况下,它可能会成功也可能不会成功,具体取决于其他字符串的顺序和长度。

【讨论】:

    【解决方案3】:

    这是因为您添加了两个字符。

    str[1] = '1' = 49

    str[3] = '4' = 52

    所以 str[1] + str[3] 是 101。

    您正在寻找的是将您的 char 转换为 int:

    char* str = "01248";
    int index1 = str[1] - 48;
    int index2 = str[3] - 48;
    printf("%x \n", str[index1 + index2]);
    

    【讨论】:

    • 我不确定他们是否会寻找这个。他们知道结果是 101,问题是这是否总是导致段错误。
    【解决方案4】:

    有一个变化,它打印了一些东西。如果操作系统为数组保留内存,它将打印一些内容,但如果访问的索引超出保留内存,则会出现分段错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-03
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 2017-02-03
      相关资源
      最近更新 更多