C语言 为什么尽管在堆上分配,指针地址仍返回 0



这是编程片段

void func1 (UInt8* data, size_t length)
{
       UInt8 *data2;
        //do some actions to populate data2 with valid data;
       length = 12;
       data = malloc(length);
       memset(data, 0 , length);
       memcpy(&data[0], &data2[9] , length);
      return;
}

void main()
{
     void *data;
     size_t dataSize;
     func1 (data, dataSize)
     printf ("%s", data);
}

这里的问题是,当我在调试器中看到数据从 func1 返回后的地址时,它指向0x0000。我的理解是,由于数据是在堆上分配的,它应该继续指向它在函数中指向的任何地址。

我在这里错过了什么?

数据仍然存在于堆上,但您传入func1的指针不会在调用站点更改,因此您正在"泄漏"内存。

您需要将指针传递给指针,以便能够处理此问题:

func1(&data, &dataSize);
void func1 (UInt8** data, size_t *length)
{
   UInt8 *data2;
    //do some actions to populate data2 with valid data;
   length = 12;
   *data = malloc(*length);
   memset(*data, 0 , *length);
   memcpy(*data, &data2[0] , *length);
   return;
}

更正:

void func1 (UInt8** data, size_t length)
{
       UInt8 *data2;
        //do some actions to populate data2 with valid data;
       length = 12;
       *data = malloc(length);
       memset(*data, 0 , length);
       memcpy(data[0], &data2[9] , length);
      return;
}

调用函数时,将复制其参数。若要在不使用函数返回值的情况下修改函数中的指针,必须使用指针来修改指针。

实际上,当您将数据作为指向函数的指针传递时,您只能修改指针下的值,而不能修改指针本身。

为此,您必须使用双指针,如下所示:

void fillData(UInt8** data, size_t length)
{
    UInt8 *data2;
    // fill data2
    *data = malloc(length);
    memset(*data, 0 , length);
    memcpy(data[0], &data2[9], length);
}    
int main()
{
    void *data;
    unsigned int dataSize = 42;
    fillData(&data, dataSize):
    printf("%s", data);
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新