c - ptr*** 不工作

标签 c pointers segmentation-fault

当代码必须在 main 的第二个 for 循环中通过 c.foos 访问 foo 元素时,代码无法正常工作(段错误)。

它只正确显示第一个元素,然后在 i=1 时显示垃圾,在 i=2 时它最终崩溃。

所以我猜这与指针数学有关。

如何正确操作?数据结构不允许更改(不,这不是作业,它是 this 数据结构的过度简化的 POC)。

#include <stdio.h>
#include <stdlib.h>

typedef struct _foo {
    int i;
} foo;

typedef struct _foo_container {
    foo ***foos;
} container;

foo** init_foos(void) {
    foo** f;
    int i;

    f = malloc(sizeof(foo*)*3);

    for(i=0; i < 3; i++) {
        f[i] = malloc(sizeof(foo));
        f[i]->i = i*11+1;
    }
    return f;
}

int main(void) {
    container c;
    foo **foos;

    foos = init_foos();

    c.foos = &foos;
    int i;
    for(i=0; i < 3; i++) {
        printf("%d %d\n", i, foos[i]->i);
    }
    for(i=0; i < 3; i++) {
        printf("%d %d\n", i, (**c.foos[i]).i);
    }
    //memory leaks, I know

    return EXIT_SUCCESS;
}

注意:此代码似乎有效。我想自上次 gcc 升级以来也发生了一些事情,尽管我可能仍然做错了什么。

附录:抱歉大家遗漏了*3,我仓促写了这个POC。实际代码确实通过 php 的 safe_emalloc() 分配了所需指针的数量。

最佳答案

尝试:

printf("%d %d\n", i, (*(*c.foos)[i]).i);

我认为问题出在运算符上 precedence .如果您不将表达式括起来,则“[]”会在“*”之前计算。

关于c - ptr*** 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7377240/

相关文章:

c - 我的链接列表中的打印功能不断出现错误,我不知道这些错误告诉我什么

c - c中指针如何在内存中存储字符串

c - 将 NULL 分配给二叉树中的子节点时出现段错误

c - 如何修复段错误?

c - 如何使ARM1136JFS (ARM v6) MMU在物理地址空间和虚拟地址空间之间有一对一的映射?

c - 从 C 中的指针指针 char 中删除字符串

c - 在此示例中,setjmp 调用的作用是什么

c++ - Lamba 类型不是由模板函数或 auto 关键字推导出来的

c++ - 如果表示为迭代器,则更改 C++ 类指针

在 Segmentation Violation 后恢复生机