【问题标题】:Confusion with weird C pointer behavior when passing through functions传递函数时与奇怪的 C 指针行为混淆
【发布时间】:2019-11-15 23:19:22
【问题描述】:

我有一个函数 int_make,我用它来将 int 转换为 void 指针:

void* int_make(int id_num){
   int* id_ptr = malloc(sizeof(int));
   id_ptr = &id_num;
   void* id = id_ptr;
return id;}

我主要通过以下方式对此进行测试

void * num_ptr = int_make(889);
printFunction(num_ptr);

printFunction(num_ptr) 将指针转换为 int* 指针,然后取消引用它

void printFunction(void * num_ptr){
printf("*(int*)num_ptr is %d\n", *(int*)num_ptr);}

我得到了预期的输出

*(int*)num_ptr is 889

一切都好,直到我调用不同的函数 testD,(忽略未使用的参数,所有非错误代码都已删除)

void testD(void* ID, void* name, void* address, void* phone, struct hashtable* hashtable){
   printf("*(int*)phone is %d\n", *(int*)phone);}

main 中的调用:

void* phone= int_make(939209);
testD(id,name,addy,phone, table);

我得到令人困惑的结果:

*(int)phone is 21985

这个数字(21985)每次我执行代码时都不一样,所以它一定是一个内存位置,虽然我不知道为什么我的策略(void* to int)在889示例(以及许多其他测试,每个重播几次)而不是这次。

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    你有:

    int* id_ptr = malloc(sizeof(int));
    

    好的。现在id_ptr 指向一个int 的内存价值。 (好吧,除非malloc 失败。)

    id_ptr = &id_num;
    

    哎呀!现在id_ptr 指向id_numint_make 函数的本地参数。 malloc返回的指针id_ptr之前的值刚刚丢失。

    void* id = id_ptr;
    return id;
    

    所以现在我们返回那个指针,指向id_num 的那个。这是一个非常糟糕的做法! id_numint_make 函数的本地参数,但一旦 int_make 返回,它就消失了。它可能会在一段时间内保留其价值,因此在调用者中取消引用 *(int*)num_ptr 可能似乎有效,但它根本不能保证,而且时间越长,它就越有可能id_num 以前使用的内存(通常是堆栈上的一个位置)将被重新用于其他用途。

    正如@user3386109 已经在评论中所说的那样,您在这里想要做的不是

    id_ptr = &id_num;
    

    而是

    *id_ptr = id_num;
    

    这会在 id_ptr 中保留 malloc 的指针,并将 id_num 的值复制到该内存,因此它会按照您的预期保留。

    【讨论】:

      【解决方案2】:

      我不确定你在这里做什么或为什么,但如果你想要一个指向 int 的指针作为 void 指针,那么你可以在这两种情况之间进行转换。你可以这样做:

      void* int_make(int id_num) {
        void *ptrToVoid = malloc(sizeof(int));
        *(int*)ptrToVoid = id_num;
        return ptrToVoid;
      }
      

      我不确定这是个好主意。拥有一个“真的”int*void* 可能会导致各种恶作剧。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多