1

根据我对上一个问题的建议,我已经更改了我的代码。现在,我有以下代码:

char* id = someFunction();      
if (strcmp(id,"0x01") == 0) {
    unsigned char cbuffer[]={0x01, 0x00};
    id=reinterpret_cast<char*>(cbuffer);
}

{0x01, 0x00}我的问题 - 将 id 传递给 char* 类型的 id 是正确的方法吗?第二个问题是 - 之后如何释放 id 指针?

4

3 回答 3

4

您是在尝试将 id 与字符串值“0x01”进行比较,还是在尝试比较 id 值(如果它是 char ASCII 0x01)?

另外,你如何释放它取决于你如何分配char*返回的someFunction()?这段代码是纯 C 还是 C++?如果someFunction()分配 using 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);  
}
于 2012-10-12T12:39:05.173 回答
3

我怀疑人们是否真的在这里建议过这样的代码。如果他们这样做了,他们就是鲁莽的。这是糟糕的代码

有机会使用char*tostd::string并相应地更改其实现someFunction。但是,这仅在一定程度上有所帮助,因为尚不清楚您在这里实际想要做什么:

将 {0x01, 0x00} 传递给 char* 类型的 id 是正确的方法吗?

这是没有意义的。你想达到什么目标?这些值表示什么,为什么要将它们重新解释为字符串?如果您只想获取由 char 值 0x01 组成的字符串,则可以使用以下方法:

std::string result = "\x01";
于 2012-10-12T12:07:46.070 回答
2

您发布的代码很危险,因为您正在传递一个指向自动范围内的存储的指针。缓冲区在离开作用域(本例中为 if 作用域)时将被丢弃。

而是尝试这样的事情:

id = strdup((char*)cbuffer);

甚至更好的是,您可以使用转义序列并避免自己指定 char 值:

id = strdup("\x01");

然后,您可以使用 释放此字符串使用的内存free

于 2012-10-12T12:04:52.700 回答