作者:简写青春 | 来源:互联网 | 2022-12-02 17:23
我在网上发现了一段代码,故意在代码中出现错误,这是调试练习的一部分.我已经修复了简单的错误,但有一行我不确定它是否有效.
#include
#include
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的malloc空间.我尝试通过mallocing space for 2 int来测试该行,以测试前2个循环是否有效.我假设程序在读取前2个int后会得到段错误,但没有发生(程序一直在运行).现在我不明白那行代码是做什么的,为什么我不是segfaulting.
我不能确切地弄清楚错误是什么,或者除了缺少malloc()之外还有一个错误,因为int*数组.
1> Some program..:
对于任何指针(或数组)p
和索引i
,表达式*(p + i)
完全等于p[i]
.
现在,如果我们接受你的表达*(fbar->array + (i-1))
,上面就等于fbar->array[i - 1]
.
问题应该清楚当i == 0
你和你有什么时会发生什么fbar->array[-1]
.它超出范围并将导致未定义的行为.
至于它为什么不崩溃,这是未定义行为的一部分.它可能会崩溃,它似乎可以起作用(就像它对你一样),或者它可能会带来鼻子恶魔.
@ Johan14th:这是关于未定义行为的事情 - 你的代码*可能会立即崩溃,或者它可能使程序处于坏状态,在以后的操作中崩溃,或者它可能导致输出错误,或者它可能看起来有效没有问题.