何时发生段错误?

use*_*063 1 c segmentation-fault

我有以下代码:

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

因为str[1]+str[3] = 101,代码寻找str [101].

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

unw*_*ind 9

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

如果没有获得未定义的行为,那么你就无法进行索引.

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

如果即使没有"坏"发生并且打印了一些值,程序仍然是错误的并且被打破.

当然,这和正义之间没有区别

printf("%x\n", str[101]);  /* BAD CODE! */
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您不知道1 + 4是否为正,您可能是C程序员:-) (2认同)