将系统符号传递给 char*

passing the system symbols to char*

本文关键字:char 系统 符号      更新时间:2023-10-16

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

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 释放此字符串使用的内存。