c - 这个 int 指针示例需要 malloc 吗?

标签 c pointers scope int malloc

以下应用程序同时使用注释掉的 malloced int 和仅使用指向本地 int 'a' 的 int 指针。我的问题是如果没有 malloc 这样做是否安全,因为我认为当函数 'doit' 返回时 int 'a' 超出范围,而 int *p 什么都不指向。该程序是否由于其简单性而没有出现段错误,或者这完全没问题?

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

typedef struct ht {
    void *data;
} ht_t;

ht_t * the_t;

void doit(int v)
{
    int a = v;
    //int *p = (int *) malloc (sizeof(int));
    //*p = a;
    int *p = &a;

    the_t->data = (void *)p;
}

int main (int argc, char *argv[])
{
    the_t = (ht_t *) malloc (sizeof(ht_t));
    doit(8);
    printf("%d\n", *(int*)the_t->data);
    doit(4);
    printf("%d\n", *(int*)the_t->data);
}

最佳答案

是的,在函数不再在范围内后取消引用指向局部堆栈变量的指针是未定义的行为。你只是碰巧不够幸运,内存没有被覆盖,没有被释放回操作系统,或者在你再次尝试访问它之前变成了一个指向恶魔工厂的函数指针。

关于c - 这个 int 指针示例需要 malloc 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28613466/

相关文章:

c - 为什么我的 D2XX 应用程序在 fork 时不起作用?

c - C 中的预 fork 模型

c++ - C++ 中的字符指针

C++ 方法变量声明

c - 为什么 printf 不等同于 scanf?

c - 如何使用与代理的单个连接从多个设备发布数据

c - 指针失去其值+ execv 编译警告

c++ - 为什么禁止将 Derived** 转换为 Base*const*?

javascript - 变量范围

javascript - 范围未在资源回调函数外部更新