【发布时间】:2019-02-22 09:02:33
【问题描述】:
我是 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ạm Anh Tuấ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。
【问题讨论】:
-
free((void *)data);?顺便说一句,您的程序将无法在64bit机器上运行。有关更多信息,请查看 64 位机器上指针的大小。 -
除了您的指针类型问题之外,您还有未定义的行为,因为您没有为终止字符串的
\0字节分配内存。 -
你为什么要写这么晦涩的代码呢?您要解决的实际问题是什么?
-
void test(uintptr_t *data) { return (uintptr_t)strdup("this is a test data"); }更短更清晰
标签: c windows visual-studio compilation