我是指针c的新手。我只是测试这样的代码
void test(uint32_t *data)
{
unsigned char raw_data[] = "this is a test data";
unsigned char *raw = (unsigned char*)malloc(strlen((char*)raw_data));
memcpy(raw, raw_data, strlen((char*)raw_data)+1);
*data = (uint32_t)raw;
}
int _tmain(int argc, _TCHAR* argv[])
{
uint32_t data;
test(&data);
printf("%s\n", data);
if (data != NULL)
{
free(data);
}
return 0;
}
我使用uint32_t
存储unsigned char*
,当我尝试释放data
时,我遇到了错误error C2664: “void free(void *)”: uint32_t can not convert to “void *"
。
我怎样才能释放data
?
首先,感谢PhạmAnhTuấn,Gerhardh,KBlr和儿子。你很善良。
解:
void test(uintptr_t *data)
{
unsigned char raw_data[] = "this is a test data";
unsigned char *raw = (unsigned char*)malloc(strlen((char*)raw_data) + 1);
memcpy(raw, raw_data, strlen((char*)raw_data));
raw[strlen((char *)raw_data)] = '\0';
*data = (uintptr_t)raw;
}
int _tmain(int argc, _TCHAR* argv[])
{
uintptr_t data;
test(&data);
printf("%s\n", data);
if (data != NULL)
{
free((void *)data);
}
getchar();
return 0;
}
必须将'\0'
添加到raw
作为终止字符串,然后free
工作。而对于64bit
的工作,将uint32_t
改为intptr_t
。
你的程序将无法在64bit
机器上工作,因为64bit
机器上的指针大小是8bytes
。
您可以使用uintptr_t
而不是uint32_t
来保存地址。虽然下面的示例代码显示,释放uintptr_t
到void*
。
#include<stdint.h>
#include<stdlib.h>
#include<stdio.h>
void test(uintptr_t *data)
{
unsigned char raw_data[] = "this is a test data";
unsigned char *raw = (unsigned char*)malloc(strlen((char*)raw_data));
memcpy(raw, raw_data, strlen((char*)raw_data)+1);
*data = (uintptr_t)raw;
}
int main(int argc, char* argv[])
{
uintptr_t data;
test(&data);
printf("%s\n", (char *)data);
if ((void *)data != NULL)
{
free((void *)data);
}
return 0;
}