指针符号的C解释?

Joh*_*4th 1 c malloc pointers runtime-error

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

我尝试运行它当然会导致段错误,因为该示例没有*array的malloc空间.我尝试通过mallocing space for 2 int来测试该行,以测试前2个循环是否有效.我假设程序在读取前2个int后会得到段错误,但没有发生(程序一直在运行).现在我不明白那行代码是做什么的,为什么我不是segfaulting.

我不能确切地弄清楚错误是什么,或者除了缺少malloc()之外还有一个错误,因为int*数组.

Som*_*ude 6

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

现在,如果我们接受你的表达*(fbar->array + (i-1)),上面就等于fbar->array[i - 1].

问题应该清楚当i == 0你和你有什么时会发生什么fbar->array[-1].它超出范围并将导致未定义的行为.

至于它为什么不崩溃,这是未定义行为的一部分.它可能会崩溃,它似乎可以起作用(就像它对你一样),或者它可能会带来鼻子恶魔.

  • @ Johan14th:这是关于未定义行为的事情 - 你的代码*可能会立即崩溃,或者它可能使程序处于坏状态,在以后的操作中崩溃,或者它可能导致输出错误,或者它可能看起来有效没有问题. (3认同)