C语言 指向局部变量的外部void指针安全吗?



我已经像上面那样声明了一个结构体

struct foo {
  void * elem;
};

我想在这个结构体中管理elem的free(),但我不知道elem的类型是什么,所以我做了一个void *来管理所有的数据类型。赋值给foo是否安全?是否需要一个指向局部变量的指针?

例如,这些方法安全吗?

// 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;
}

不管你的代码示例是否有效(两者都没有正确地说明问题),永远不能有效或安全地保留指向生存期之外的变量的指针

。解引用这样的指针是未定义的行为,原则上任何事情都可能发生。在实践中,发生的事情是该变量的内存变得可以重用,如果你通过指针读取它,它可能不再包含相同的值,如果你写它,你可能会修改一些不相关的数据对象或损坏调用堆栈-在任何情况下的行为都是非确定性;这比未定义的行为更没用。

请注意,这是生命周期的问题,而不是作用域的问题。指向本地static的指针是有效的。

第一个无法编译。从某种意义上说,它不是安全代码,它根本就不是代码。

第二个只是无用地修改了局部变量x。它是安全的,因为它实际上什么也不做,而且什么都不做本身也没有什么害处。

最新更新