1

前の質問の推奨事項に従って、コードを変更しました。今、私は次のコードを持っています:

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

{0x01, 0x00}私の質問-char*型のIDにを渡すのは正しいアプローチですか?そして2番目の質問は-後でidポインタを解放する方法は?

4

3 に答える 3

4

idを文字列値"0x01"と比較しようとしていますか、それともchar ASCII 0x01の場合はid値を比較しようとしていますか?

また、どのように解放するかは、どのように割り当てたのかによって異なり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);  
}
于 2012-10-12T12:39:05.173 に答える
3

私は人々が実際にここでそのようなコードをアドバイスしたとは思えません。もしそうなら、彼らは無謀でした。これは悪いコードです。

char*toの使用法を変更し、それに応じstd::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 に答える