我在网上找到了一段代码,作为调试工作的一部分,该代码故意存在代码错误。我已经解决了简单的错误,但是我不确定其中是否有效。
#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个int之后会出现段错误,这不会发生(程序继续运行)。现在,我不明白该行代码的功能以及为什么我不进行段错误处理。
我无法确切地找出错误所在,或者除了int * array缺少malloc()之外是否还有错误。
答案 0 :(得分:6)
对于任何指针(或数组)p
和索引i
,表达式*(p + i)
等于p[i]
。
现在,如果我们采用您的表达式*(fbar->array + (i-1))
,则上面的表达式等于fbar->array[i - 1]
。
问题应该很清楚,当i == 0
和您有fbar->array[-1]
时会发生什么。它超出范围,将导致undefined behavior。
关于为什么它不会崩溃,这是未定义行为的一部分。它可能会崩溃,似乎可以正常运行(就像对您一样),或者可能带来nasal demons。