嵌入式内存分配和范围

Embedded memory allocation and scope

如果我想创建一个结构体初始化函数,return一个指向初始化结构体成员的指针,将分配内存到new_foo[=25中的数据数组=] 在函数外仍然有效?

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

typedef struct structure{
    char* data;
    size_t num;
}foo_t;


foo_t* new_foo(size_t num);

int main(void){
    foo_t* foo = new_foo(32);
    while(1){;}
}

foo_t* new_foo(size_t num){
    foo_t* self;
    char temp[num];
    self->data = temp;

    self->num = num;

    return self;
}

我想看一下汇编代码,看看是否有什么东西跳出来,唯一可能让我认为内存仍然有效的是没有与

相关的堆栈操作
char temp[num];
self->data = temp;

但我已经有一段时间没看汇编代码了。

https://godbolt.org/z/5Wx4TY

[编辑] 已修改 new_foo

foo_t* new_foo(size_t num){
    static foo_t self = {NULL, 0};
    char data_array[num];
    self.data = temp;

    self.num = num;

    return &self;
}

函数有未定义的行为。

foo_t* new_foo(size_t num){
    foo_t* self;
    char temp[num];
    self->data = temp;

    self->num = num;

    return self;
}

对于初学者来说,指针 self 未初始化且具有不确定的值。

变长数组temp是函数的局部变量,退出函数后不会存活。所以从函数返回的任何指向它的指针都是无效的。