2014-06-23 120 views
1

我有以下代码:段错误何时发生?

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

由于str[1]+str[3] = 101,代码查找str [101]

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

+1

可能的重复[为什么在写入字符串时出现分段错误?](http ://stackoverflow.com/questions/164194/why-do-i-get-a-segmentation-fault-when-writing-to-a-string) –

+1

我没有得到-1s。谨慎解释他们?这是一个显示缺乏知识的问题,这是一个问题应该做的事情。这本身并不是一个坏问题...... – glglgl

回答

9

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

你正在索引出界,你不能这样做,没有得到未定义的行为。

究竟发生了什么,等待它,未定义。它可能导致段错误,可能根本没有问题,有些值可能会打印出来,但你不知道。

如果即使没有什么“不好”的事情发生,并打印了一些值,程序仍然存在问题并且被破坏。

而且,当然有,只是

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

你计算通过添加两个有效的指针引用不要紧无效的数组索引其实这没有什么区别,这是混乱的只是一个额外的层。另外,您不能“知道”1 + 4是任何特定的数值,这取决于目标机器的字符编码。在ASCII中,它将是49 + 52,即101.你甚至不知道'1' + '4'正数

+0

非常感谢。 – user25063

+2

如果你不知道1 + 4是否是肯定的,你可能是一个C程序员:-) –

+0

@KerrekSB糟糕,我丢失了单引号,这使得它比我的意思更混乱。谢谢。 – unwind

0

发生这种情况是因为您添加了两个字符。

STR [1] = '1'= 49个

STR [3] = '4'= 52

所以STR [1] + STR [3]是101

什么你要找的是你的字符转换成INT:

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

我不确定他们在寻找这个。他们知道结果是101,问题是如果这总是导致段错误。 – glglgl

2

请问这段代码的get(总是)分段错误?

的字符串字面在于一个特殊的rodata部分与其他所有字符串文字和也许其他只读数据(虽然我不知道这可能是什么)。

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

尽管如此,它是未定义的行为,你不应该依赖它。在疑虑的情况下,根据其他字符串的排序和长度而定,它可能成功也可能不成功。

0

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