繁体   English   中英

指针符号的C解释?

[英]C explanation for pointer notation?

我在网上找到了一段代码,作为调试工作的一部分,该代码故意在代码中存在错误。 我已经解决了简单的错误,但是我不确定其中是否有效的一行。

#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()之外是否还有错误。

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

现在,如果我们使用表达式*(fbar->array + (i-1)) ,则上述fbar->array[i - 1]等于fbar->array[i - 1]

问题应该很清楚,当i == 0并且您有fbar->array[-1]时会发生什么。 它超出范围,将导致不确定的行为

至于为什么它不会崩溃,那是未定义行为的一部分。 它可能会崩溃,它似乎可以工作(就像对您一样),或者它会带来鼻恶魔

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM