2016-04-02 6 views
0

私は一般化されたリンクリストを扱わなければならないので、データフォーマットをvoid *からintに変えることはできません。C - アドレス/ポインタ値の代わりに真のint値をvoidポインタに代入する?

極小のバージョン:

int main(int argc, char **argv) { 
    void *data; 
    int i = 100; 
    *((int*)data) = i; 
    printf("%d", (int)data); 
    return 0; 
} 

はアドレスを印刷し保持します。同様に、data = &iもアドレスを返します。 data = iの場合はエラーになります。私は可能な限り試してみたところ、idataに挿入することはできません。

+2

「データ」を参照することはできません。これは初期化されていません。鼻の悪魔は続けるかもしれません... –

+0

GCCの/ Clangの '-Wall'オプションが有用な理由の優れた例:彼らはこれを心からあなたを叩くでしょう。 –

答えて

1

あなたは最初の有効なメモリアドレスにdataポイントを作成する必要があります。そのmalloc()なければ

int main(int argc, char **argv) { 
    void *data = malloc(sizeof (int)); 
    int i = 100; 
    *((int*)data) = i; 
    printf("%d", *((int*)data)); 
    return 0; 
} 

、(ランダムなアドレスに初期化されていないオブジェクトに& &書き込みデータへのアクセス)ダブル未定義の動作が呼び出されます。

また、printf()ステートメントの(int)dataから*((int*)data)に変更してください。 sizeof (int) > sizeof (void *)の場合、キャスト時にdataが切り捨てられます。

+0

それでも、希望の '100 'の代わりにアドレスが返されます:/ – Synlar

+1

@Synlar' printf( "%d"、*((int *)data)); ' –

0

void *を一般化されたコンテナとして使用する必要がある場合。

ガット1は、通常、インターネットを想定することができ

それ以外の場合はいくつかの点で、それ

void * data = malloc(sizeof(DATATYPE)); // Datatype can be int in this case 

その後

*((int *)data) = SOME VALUE; 

その後自由が「フィット」整数または他のデータタイプの2つのオプションにvoid *。

私はこの道を下りません。

関連する問題