我是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
。
答案 0 :(得分:0)
由于<context:property-placeholder location="file:///C:/dev/workspace/application/config/${spring.profiles.active}/application-${spring.profiles.active}.properties" />
计算机上的指针大小为64bit
,因此您的程序无法在64bit
计算机上运行。
您可以使用8bytes
代替uintptr_t
来保存地址。
释放时,将uint32_t
强制转换为uintptr_t
,如下面的示例代码所示。
void*