#include <stdio.h>

struct arr_wrapper{
    int* arr;
};

struct bar{
    struct arr_wrapper* arr_wrapper_obj;
};

void assign_arr(struct arr_wrapper* X){
    int arr[3];
    for (int i = 0; i < 3; i++){
        arr[i] = i;
    }
    X->arr = arr;
    return;
}

void my_func(struct bar* bar_obj){
    for (int i = 0; i < 3; i++){
        printf("%d\n", bar_obj->arr_wrapper_obj->arr[i]);
    }
    return;
}

int main()
{
    struct arr_wrapper arr_wrapper_obj;

    assign_arr(&arr_wrapper_obj);
    for (int i = 0; i < 3; i++){
        printf("%d\n", arr_wrapper_obj.arr[i]);
    }
    struct bar bar_obj;
    bar_obj.arr_wrapper_obj = &arr_wrapper_obj;
    for (int i = 0; i < 3; i++){
        printf("%d\n", bar_obj.arr_wrapper_obj->arr[i]);
    }
    my_func(&bar_obj);
    printf("Hello World");

    return 0;
}

这行代码的输出为:

0
1
2
0
1
2
32765
1
2
Hello World

这是我的代码的简化版本.

我试图创建一个 struct 的 struct ,内部 struct 有一个array.

然而,数组的大小是动态的,在运行时之前无法确定,所以我使用了一个int指针来指向array.

推荐答案

您正在保存局部变量的地址.

void assign_arr(struct arr_wrapper* X){
    int arr[3]; // <<<<=== local variable
    for (int i = 0; i < 3; i++){
        arr[i] = i;
    }
    X->arr = arr; <<<<, save it
    return;
}

这是无效的.一旦函数返回,就会释放局部变量.

C++相关问答推荐

C中的ATONE会扰乱SEN/CLUTE GMS应用程序中的其他字符串

C指针地址和转换

C:二进制搜索和二进制插入

自定义变参数函数的C预处置宏和警告 suppress ?

Square不与Raylib一起移动

等同于铁 rust 的纯C语言S未实现!()宏

OpenSSL:如何将吊销列表与SSL_CTX_LOAD_VERIFY_LOCATIONS一起使用?

#定义SSL_CONNECTION_NO_CONST

预处理器宏扩展(ISO/IEC 9899:1999(E)§;6.10.3.5示例3)

我在C程序的Flex/Bison中遇到语法错误

如何组合两个宏来初始化C语言中的字符串数组?

程序对大输入给出错误答案

如何打印循环调度问题的时间表

如何正确探测平台设备?

快速准确计算double的小数指数

如何使用 raylib 显示数组中的图像

C99 的 %zu 格式说明符不起作用

int 与 size_t 与 long

用于内存布局的size命令(文本、数据、bss)

M1 Mac 上的 jmp_buf 如何解码?