2

cのvoid*ポインタを理解するのに問題があります。私はグーグルで調べましたが、この特定の問題を解決する方法を本当に理解していません:

typedef struct _Test{
   char* c;
}Test;


void method(void* test){
    Test t;
    t = *(Test*)test;
    t.c = "omg";
    printf(t.c); //WORKS
}

int main(){
Test t;
method(&t);
printf(t.c); //NOT WORKING,  prints nothing/random letters

return 0;}

なんで?というか、この問題を修正/回避するための最良の方法は?

4

4 に答える 4

11

のオブジェクトをコピーした後、t内部のローカルオブジェクトを変更しています。他の方向にコピーすることはないため、これによってオブジェクトの内容が変更されることはありません。method()main()tmain()

ポインタを介してアクセスし、呼び出し元のオブジェクトを直接変更する必要があります。

((Test *) test)->c = "omg";

または、適切なタイプのローカルポインターを使用して、それを少し明確にすることができます。これは、あなたがやろうとしていたことかもしれません。

void method(void* test) {
    Test *t = test;
    t->c = "omg";
}

自動的にCvoid *に変換されるため、ここではキャストは必要ありません。Test *

于 2012-12-06T12:23:40.343 に答える
3

メソッド(スタック上に作成された)でオブジェクトを定義し、Testそこに指定されたポインターをポイントします。メソッドが戻った後、スタック割り当てTestはなくなります。

リライト:

void method(void* test){
    Test *t;                     // defines a pointer to a Test object
    t = (Test*)test;             // casts the void pointer to a Test pointer
    t->c = "omg";                // assigns data to attribute
    printf(t->c); //WORKS
}

もちろん、すべてを1行にまとめることができ(を除く)、スタックに割り当てられたポインターprintf()は不要です。Test

 void method(void* test){
        ((Test *)test)->c = "omg";
 }
于 2012-12-06T12:24:06.297 に答える
1

tmethod()スコープシャドウtmain()、決して触れられないため、呼び出したときに不確定なデータが含まれますprintf()

于 2012-12-06T12:26:35.487 に答える
1
typedef struct _Test{
   char* c;
}Test;


void method(void* test){
    Test *t;
    t = (Test*)test;
    t->c = "omg";
    printf(t->c); //WORKS
}

int main(){
Test t;
method(&t);
printf(t.c);

return 0;}
于 2012-12-06T12:46:40.173 に答える