我有以下代码:
char* str = "01248";
printf("%x \n", str[str[1] + str[3]]);
作为str[1]+str[3] = 101
,代码会查找str [101]
。
此代码是否会(始终)出现分段错误错误? 或者我们在这个地址有变化,我们会打印一些东西吗?
答案 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)
有一个变化,它打印出来的东西。如果操作系统为数组保留内存,它将打印一些内容,但如果访问的索引超出保留内存则会出现分段错误