指针符号的 C 解释?

标签 c pointers malloc 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;
}

我尝试运行它,这当然会导致段错误,因为该示例没有为 *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/

相关文章:

c - 让两个指针指向同一个内存块的正确方法

计算 c 中布隆过滤器的汉明距离?

C:使用带有函数指针的二维数组

pointers - GO - 隐式方法如何工作?

c - malloc/calloc 分配一个已经分配的地址

c - 用于在 C 中返回值的空闲内存

c - 在 Visual Studio 中调试时故意导致 C 程序内存泄漏会发生什么?

c - 有没有办法在 C90 标准中使枚举无符号? (符合 MISRA-C 2004)

c++ - Emacs 大括号和括号突出显示?

c - 鉴于 p 是指向不完整类型的指针,&*p 是有效的 C 语言吗?