何时发生段错误?

时间:2014-06-23 07:13:28

标签: c segmentation-fault

我有以下代码:

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

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

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

4 个答案:

答案 0 :(得分:9)

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

您正在为超出范围编制索引,但如果不采取未定义的行为,则无法做到这一点。

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

即使什么都没有"坏"发生了,打印了一些值,程序仍然有问题并且坏了。

此外,当然这与

之间没有区别
printf("%x\n", str[101]);  /* BAD CODE! */

通过添加两个有效的解引用来计算无效数组索引这一事实并不重要,这只是一个额外的混淆层。此外,你不能知道" 1 + 4是任何特定的数值,直到目标机器的字符编码。在ASCII中,它将是49 + 52,即101.你甚至不能知道'1' + '4'正面

答案 1 :(得分:2)

  

此代码是否会(始终)出现分段错误错误?

没有

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

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

然而,它是未定义的行为,你不应该依赖它。在有疑问的情况下,根据其他字符串的顺序和长度,它可能成功也可能不成功。

答案 2 :(得分:0)

这是因为你要添加两个字符。

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]);

答案 3 :(得分:0)

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