将系统符号传递给 char*
passing the system symbols to char*
我已经根据对我上一个问题的建议更改了我的代码。现在,我有以下代码:
char* id = someFunction();
if (strcmp(id,"0x01") == 0) {
unsigned char cbuffer[]={0x01, 0x00};
id=reinterpret_cast<char*>(cbuffer);
}
我的问题 - 将{0x01, 0x00}
传递给 char* 类型的 id 是正确的方法吗?第二个问题是 - 之后如何释放 id 指针?
您是尝试将 id 与字符串值"0x01"进行比较,还是尝试比较 id 值(如果它是字符 ASCII 0x01?
另外,如何释放它取决于你如何分配char*
someFunction()
返回? 这段代码是纯C还是C++?如果someFunction()
使用new char[2]
分配,那么你必须使用delete[]
释放它。如果使用 C 样式分配 malloc(sizeof(char)*2)
,则必须执行free(id)
。
还要考虑,在你做strdup
之前,正如上一篇文章所建议的,你必须释放原始 ID。这当然是假设,如果按照设计,someFunction()
返回的指针不指向某个不应该被解除分配的全局常量。
char* id = someFunction();
if (strcmp(id,"0x01") == 0) { // no idea if this line make sense at all.
free(id); // or delete[] id; if id is allocated using new char[];
static char[] cbuffer = {0x01, 0x00};
id = (char*) malloc(sizeof(char)*2);
strcpy(id, cbuffer);
}
我怀疑人们是否真的在这里建议过这样的代码。如果他们这样做了,他们就是鲁莽的。这是糟糕的代码。
有机会使用char*
来std::string
并相应地更改someFunction
的实现。但是,这仅在某种程度上有所帮助,因为不清楚您实际上想在这里做什么:
将 {0x01, 0x00} 传递给 char* 类型的 ID 是正确的方法吗?
这是没有道理的。你想实现什么?这些值表示什么,为什么要将它们重新解释为字符串?如果您只想获取由 char 值组成的字符串0x01,则以下方法有效:
std::string result = "x01";
您发布的代码很危险,因为您正在传递指向自动范围内的存储的指针。缓冲区在离开范围(在本例中为 if 的作用域)时将被丢弃。
相反,请尝试这样的事情:
id = strdup((char*)cbuffer);
或者更好的是,您可以使用转义序列并避免自己指定 char 值:
id = strdup("x01");
然后,可以使用 free
释放此字符串使用的内存。