嵌入式内存分配和范围
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;
但我已经有一段时间没看汇编代码了。
[编辑] 已修改 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
是函数的局部变量,退出函数后不会存活。所以从函数返回的任何指向它的指针都是无效的。
如果我想创建一个结构体初始化函数,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;
但我已经有一段时间没看汇编代码了。
[编辑] 已修改 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
是函数的局部变量,退出函数后不会存活。所以从函数返回的任何指向它的指针都是无效的。