这是编程片段
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;
}