【问题标题】:malloc() call does not persist across functions [duplicate]malloc() 调用不会跨函数持续存在[重复]
【发布时间】:2021-06-29 13:09:57
【问题描述】:

代码:

struct Adjacent {
    char* c;
    int done_at; 
};

typedef struct Adjacent Adj; 

struct Container {
    Adj* m;
};

typedef struct Container Cont;

void alloc_stuff(Cont *cont) {
    cont = (Cont*)malloc(100 * sizeof(Cont));
    memset(cont, 0, 100 * sizeof(Cont));
    for (int i = 0; i < 100; ++i) {
        cont[i].m = (Adj*)malloc(50 * sizeof(Adj));
        memset(cont[i].m, 0, 50 * sizeof(Adj));
        cont[i].m->c = (char*)malloc(50 * sizeof(char));
        memset(cont[i].m->c, 0, 50 * sizeof(char));
        cont[i].m->done_at = 0;
    }
}

int main() {
    Cont* cont = NULL;

    alloc_stuff(cont);

    // cont still NULL here
}

为什么cont 在alloc_stuff() 之后为NULL?

【问题讨论】:

  • 它是 NULL 因为你没有改变它。更改您的 API 并执行 alloc_stuff(&amp;cont); 或 cont = alloc_stuff();

标签: c malloc


【解决方案1】:

正是因为这一行:

void alloc_stuff(Cont *cont)

变量 cont 是传递给函数的原始指针的副本。

如果你想修改原来的指针,你应该使用这样的东西:

void alloc_stuff(Cont **cont)

【讨论】:

    【解决方案2】:

    alloc_stuff(cont); 将cont 的值传递给alloc_stuff。

    alloc_stuff 没有收到对cont 的任何引用。在alloc_stuff 中所做的任何更改都不会影响cont。

    要更改main 中cont 的值,您应该修改alloc_stuff 以返回一个指针并使用cont = alloc_stuff();,或者您应该修改alloc_stuff 以接受一个指向Cont * 的指针(所以它将是Cont **),然后修改其中的代码以使用*cont,当前使用cont,之后您可以使用alloc_stuff(&amp;cont); 调用它。 (或者,如果需要括号,请使用(*cont) 代替cont。)

    【讨论】:

    • *cont[i]-&gt;m = (Adj*)malloc(50 * sizeof(Adj)); 给出 `no operator = 匹配这些操作数。操作数是 Adj 和 Adj*,即使 Cont 有 Adj* 而不是 Adj(无指针)
    • @Sebi:按照答案中的说明使用括号。 [ 的优先级高于*,因此您需要(*cont)[i]-&gt;m,而不是*cont[i]-&gt;m。此外,该错误消息表明您正在编译为 C++,而不是。这些是不同的语言,有不同的规则。在 C++ 中,对指针的引用可能比指向指针的指针更合适,并且它可以避免更改 alloc_stuff 中的代码;您只需要更改声明即可。
    • 是的,我正在编译为 C++。 (*cont)[i]-&gt;m = (Adj*)malloc(50 * sizeof(Adj)); 给出的表达式必须有一个指针类型。语法如何变化(参考 2 指针)?
    • Nvm (cont)[i]->m 是 Adj& 类型。 (*cont)[i].m 是 Adj
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2019-07-03
    • 2016-03-01
    • 2016-08-06
    • 1970-01-01
    相关资源
    最近更新 更多