【问题标题】:void pointer as an argument in function [duplicate]void指针作为函数中的参数[重复]
【发布时间】:2015-06-26 11:10:51
【问题描述】:

我有一个函数 f1 需要 void 指针。从调用者那里,我想要将 void 指针传递给 A 的通用逻辑,它会在内部修改指针。

示例代码粘贴在下面:

#include "stdio.h"
#include "malloc.h"
void f1(void* a)
{
    printf("f(a) address = %p \n",a);
    a = (void*)(int*)malloc(sizeof(int));

    printf("a address = %p \n",a);
    *(int*)a = 3;

    printf("data = %d\n",*(int*)a);
}

void f(void)
{
    void* a1=NULL;
    printf("a1 address = %p \n",a1);

    f1(a1);

    printf("a1 address = %p \n",a1);
    printf("Data.a1 = %d\n",*(int*)a1);
}

int main()
{
    f();
}

但它会导致分段错误。有没有什么方法可以在不改变f1函数原型的情况下让它工作?

【问题讨论】:

  • 我看到有人将void * 转换为int *float * 之类的东西,以获取malloc() 的返回值,但你... void * -> int * -> @ 987654332@?为什么?
  • 为什么这会得到如此多的支持?这只是另一个“我没有费心去查找价值传递意味着什么”的问题……
  • @TheParamagneticCroissant 可能与this question 得到的原因相同。 ....叹息.... :-|

标签: c


【解决方案1】:

C 使用按值传递函数参数传递。如果您必须从函数内部更改传递的变量本身,则需要有一个指向该变量的指针。

在你的情况下,它应该是一个指向指针的指针。

否则,在调用f1(a1); 之后,在f() 中,a 仍然是NULL,并且取消引用它会调用undefined behaviour。分段错误是 UB 的副作用之一。

也就是说,

  1. see why not to castmalloc()C中的family返回值。

  2. 你不需要#include "malloc.h" 来使用malloc(),而是使用#include <stdlib.h>。它在stdlib.h 头文件中声明。

【讨论】:

    【解决方案2】:

    您需要修改指针,而不是 ponted to data。所以你必须传递一个指向指针的指针,像这样

    void f1(void **a)
     {
        int *b;
        b = malloc(sizeof(*b));
    
        printf("b address = %p \n", b);
        if (b != NULL)
         {
            b[0] = 3;
            printf("data = %d\n", *(int *) b);
         }
        *a = b;
     }
    

    你这样做的方式,f1 内部的指针是传递的指针的副本,它们都包含相同的初始值 NULL,你在 f() 中使用的值来初始化 a1,但是你只改变本地指针的值。

    然后您取消引用 a1(仍然是 NULL),并取消引用 NULL 指针,会导致未定义的行为。在您的情况下,行为是发生分段错误。

    【讨论】:

      猜你喜欢
      • 2016-05-03
      • 2012-09-09
      • 2016-12-13
      • 2014-07-16
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 2011-02-05
      相关资源
      最近更新 更多