指针表示法的 C 解释?



>我在网上发现了一段代码,作为调试练习的一部分,它故意在代码中存在错误。我已经修复了简单的错误,但有一行我不确定它是否有效。

#include <stdlib.h>
#include <stdio.h>
struct foo {
int size;
int *array;
};
typedef struct foo bar;
bar* readArray(){
bar *fbar = (bar *)malloc(sizeof(bar));
fbar->array = (int *)malloc(sizeof(int)*2); //ADDED THIS LINE FOR TESTING
int i = 0;
int temp;
while(scanf("%d", &temp) == 1){
*(fbar->array + (i-1)) = temp; //THIS LINE HERE
i++;
}
if(i == 0){
printf("No numbers were entered!");
}
fbar->size = i;
return fbar;
}
int main(){
bar *p = readArray();
return 0;
}

我尝试运行它,这当然会导致段错误,因为该示例没有为 *array 分配空间。我尝试通过为 2 个 int 分配空间来测试该行,以测试前 2 个循环是否有效。我假设程序在读取前 2 个 int 后会出现段错误,这并没有发生(程序继续运行(。现在我不明白那行代码是做什么的,为什么我不进行分段错误。

我无法确切地弄清楚错误是什么,或者除了缺少 int *array 的 malloc(( 之外,是否还有错误。

对于任何指针(或数组(p和索引i表达式*(p + i)完全等于p[i]

现在,如果我们将您的表达式*(fbar->array + (i-1)),上面等于fbar->array[i - 1].

问题应该很清楚,当i == 0和你有fbar->array[-1]时会发生什么。它超出了界限,将导致未定义的行为

至于为什么它不会崩溃,这是未定义行为的一部分。它可能会崩溃,它似乎有效(就像它对你所做的那样(,或者它可能带来鼻魔。