指向局部变量的外部 void 指针安全吗?
Is an external void pointer to a local variable safe?
我有一个结构如上声明
struct foo {
void * elem;
};
我想在这个结构中管理elem的free(),但是我不知道elem的类型是什么,所以我做了一个void *
来管理所有的数据类型。
将指向局部变量的指针分配给 foo.elem 是否安全?
例如,这些方法安全吗?
// Method 1
struct foo * get_foo() {
int a = 10;
struct foo x = malloc(sizeof(struct foo));
x.elem = &a;
return x;
}
// Method 2
void get_foo(struct foo x) {
int a = 10;
x.elem = &a;
}
第一个不编译。这不是安全代码,因为它根本不是代码。
第二个只是无用地修改局部变量x
。它是安全的,因为它实际上什么都不做,而且什么都不做本身并没有什么害处。
无论您的代码示例作为您所问内容的范例是否有效(均未正确说明问题),保留指向的指针从不有效或安全该变量 生命周期 之外的变量。
取消引用这样的指针是未定义的行为,原则上任何事情都可能发生。实际上发生的是该变量的内存可用于重用,如果您通过指针读取它,它可能不再包含相同的值,如果您写入它,您可能正在修改一些不相关的数据对象或破坏调用堆栈 - 两种情况下的行为都是 non-deterministic;这比未定义的行为更有用。
请注意,这是 lifetime 的问题,而不是 scope 的问题。指向 local static
的指针是有效的。
我有一个结构如上声明
struct foo {
void * elem;
};
我想在这个结构中管理elem的free(),但是我不知道elem的类型是什么,所以我做了一个void *
来管理所有的数据类型。
将指向局部变量的指针分配给 foo.elem 是否安全?
例如,这些方法安全吗?
// Method 1
struct foo * get_foo() {
int a = 10;
struct foo x = malloc(sizeof(struct foo));
x.elem = &a;
return x;
}
// Method 2
void get_foo(struct foo x) {
int a = 10;
x.elem = &a;
}
第一个不编译。这不是安全代码,因为它根本不是代码。
第二个只是无用地修改局部变量x
。它是安全的,因为它实际上什么都不做,而且什么都不做本身并没有什么害处。
无论您的代码示例作为您所问内容的范例是否有效(均未正确说明问题),保留指向的指针从不有效或安全该变量 生命周期 之外的变量。
取消引用这样的指针是未定义的行为,原则上任何事情都可能发生。实际上发生的是该变量的内存可用于重用,如果您通过指针读取它,它可能不再包含相同的值,如果您写入它,您可能正在修改一些不相关的数据对象或破坏调用堆栈 - 两种情况下的行为都是 non-deterministic;这比未定义的行为更有用。
请注意,这是 lifetime 的问题,而不是 scope 的问题。指向 local static
的指针是有效的。