我在网上发现了一段代码,作为调试练习的一部分,它故意在代码中包含错误。我已经修复了简单的错误,但有一行我不确定它是否有效。
#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 后会出现段错误,但这并没有发生(程序继续运行)。现在我不明白那行代码的作用以及为什么我没有出现段错误。
我不能确切地弄清楚错误是什么,或者除了缺少 malloc() 用于 int *array 之外是否还有错误。
最佳答案
对于任何指针(或数组)p
和索引i
表达式*(p + i)
完全等于 p[i]
.
现在,如果我们采用你的表达式 *(fbar->array + (i-1))
,它等于 fbar->array[i - 1]
.
问题应该很清楚当 i == 0
并且您有 fbar->array[-1]
时会发生什么。它超出了范围,将导致 undefined behavior .
至于为什么它不会崩溃,那是未定义行为的一部分。它可能会崩溃,它可能看起来有效(就像它对你一样),或者它可能会产生 nasal demons .
关于指针符号的 C 解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52725166/