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。我的理解是,由于数据是在堆上分配的,它应该继续指向它在函数中指向的任何地址。

我在这里想念什么?

4

3 回答 3

2

数据仍然存在于堆中,但您传入的指针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;
}
于 2013-10-28T23:26:56.317 回答
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;
}

调用函数时,会复制其参数。要修改函数外的指针,不使用函数返回值,你必须使用指针来修改你的指针。

于 2013-10-28T23:26:40.523 回答
0

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

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

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;
}
于 2013-10-28T23:32:03.040 回答