C编程:即使在双指针的内容上完成,指针分配也会丢失

问题描述 投票:0回答:1

所以,我一直在努力解决这个问题,经过深夜的大量拉扯之后,我决定看看你们是否都想对此进行破解。

总之,我正在尝试通过将分配代码移交给main之外的另一个函数来设置动态分配的结构,以供程序使用。我知道这样做的两种方法:一种是让函数返回指向已分配结构的指针,例如:

typeStruct *someFunction()

或两个,将双指针传递给该结构,对其取消引用,并在内部指针上分配内存。喜欢:

void someFunction(typeStruct **ptr)

我正在尝试使用后者,因为我想将返回值用于char标志而不是结构本身。

[不幸的是,似乎在对指针的尊重上所做的更改并未使其超出函数的范围。我设法用一个简单的示例程序来复制我的问题。这是代码:

test.c:

#include "testheader.h"

int main() {

    char success = 0;
    test *t;
    printf("\nBefore setup (in Main), Test: %d", t);
    success = setupTest(&t);
    printf("\nAfter setup (in Main), Test: %d", t);

    free(t->numbers);
    free(t);

    return success;
}

testheader.c:

#include "testheader.h"

const int NUM_NUMBERS = 100;

char setupTest(test **ptr) {
    printf("\nBefore deference, Test: %d", *ptr);
    char flag = 0;
    test *t = *ptr;
    printf("\nBefore malloc, Test: %d", t);
    t = malloc(sizeof(test));
    printf("\nAfter malloc, Test: %d", t);
    if(t != NULL) {
        t->numbers = malloc(sizeof(int) * NUM_NUMBERS);
        if(t->numbers != NULL) {
            for(int i = 0; i < NUM_NUMBERS; ++i) t->numbers[i] = i;
        } else flag = 1;
    } else flag = 1;
    printf("\nEnd of setup, Test: %d", t);
    return flag;
}

testheader.h:

#ifndef TESTHEADER_H
#define TESTHEADER_H

#include <stdlib.h>
#include <stdio.h>
typedef struct test_t {

    int *numbers;

} test;

char setupTest(test **);

#endif

这里是我的编译方式:gcc test.c testheader.c -o test.exe

我正在使用gcc 5.1.0在git bash中进行编译,并运行Windows 10的控制台。

这是运行test.exe的输出:Console debugging

然后崩溃。可以看到,函数内部的行为符合预期,尽管函数外部的代码未反映内部进行的分配,就好像我只是传递了指针本身,而不是通过带有双指针的引用传递一样。

我在这里缺少什么吗?

c pointers scope pass-by-reference
1个回答
1
投票
test *t = *ptr;

我不知道您是否认为这是在tptr之间建立了某种link,但事实并非如此。它只是将后者分配给前者,当您到达时,后者将变得毫无意义:

t = malloc(sizeof(test));

t被覆盖的地方。

在那之后,您缺少的是某种形式的赋值给**ptr的赋值,这意味着该赋值与输入时一样。当然,这就是您所看到的。

需要要做的是取t的值,并用它填充传入的变量:

*ptr = t;
© www.soinside.com 2019 - 2024. All rights reserved.