2016-10-08 20 views
-1

Cプログラムで問題が発生しました。私は作業する必要があります(C++ではなく)。ポインタがnullに初期化されて0x1に変更されました

私はリストと呼ばれる構造体typedefを持っています。私はこの機能を持っている:私はこれの出力は次のようになり、この

list l; 
printf("malloc\n"); 
init(&l); 
printf("Pointer= %p\n", (void *) l.next); 

を持って、別のファイルで

void init(list * l){ 
    l=malloc(sizeof(list)); 
    l->data=NULL; 
    l->index=NULL; 
    l->next=NULL; 

    printf("Pointer= %p\n", (void *) l->next); 
} 

戻る(とき以下のOSの上で):

malloc 
Pointer= (nil) 
Pointer= 0x1 

ことができます誰でもこれが突然NULLから0x1に変わる方法を私に説明してください。私が0x1としてこれを使用しようとすると、実際には私を悩ませています。

このコードはMacBookではうまく動作しますが、CentOSとUbuntu 16.04では上記の出力が生成されます。 私はそれがNULLにとどまっていることを確認できますか?私は愚かですか?あなたがする必要がどのような

おかげ

+3

'l =(list *)malloc(sizeof(list));'を削除します。再度試してください。 – BLUEPIXY

+0

同じこと。私は望みを持ってそれを変更しました:P私はそれを問題からとにかく取り除きます。 – Christopher

+1

'malloc'を削除してから**あなたのポーグラム全体**を表示します。それが大きすぎると最小限に抑えるには、[mcve]を参照してください。 –

答えて

0

Doing list l;はすでにlのメモリを割り当てます。そのようなメモリのアドレスは、&lによって得ることができる。

initに渡すものは、本質的に数値で、メモリ内のアドレスです(例:0x0000)。 initが実行されると、lはアドレス(0x0000)の値を持ちます。 lのタイプがlist*であるという事実は、llistオブジェクトのアドレス(*)であることを意味する。

mallocは、新しいメモリ(この場合はsizeof(list))を割り当て、そのメモリがある場所のアドレス(数値)を返します。基本的には、mallocによって提供されるアドレスがinitと呼ばれるものとは異なるため、lの値が効果的に変更されています。

mallocを削除すると問題が解決するはずです。

+0

説明ありがとうございます! :Dは今働いている – Christopher

0

init()に二重のポインタを渡す、またはポインタを返すinit()持っているのいずれかです。

Cでは、すべての値はによって渡されます。したがって、ポインタをinit()に渡すと、listというメモリ位置が渡されます。 init()を実行すると、malloc()を呼び出すと、l変数に渡された値が上書きされます。ただし、ではなく、が渡されたポインタを更新します。これは、ローカル変数list lのメモリ位置を依然として指しています。

+2

いいえ、 'malloc'を削除すれば十分です。 –

+0

私はそれをしたいと思いますが、プログラムのために、関数のシグネチャを指定するヘッダファイルを与えたところで、受け取る値やその戻り値を変更できないことを意味します。自動化されたテストも楽しくなるので、変更があれば私が期待しているすべてのものが破られるでしょう。/ – Christopher

+0

それから@n.m。提案:mallocを削除するか、 'init()'の呼び出し元でそれを行います。 – ynimous

0

現在、init関数は新しいオブジェクトを割り当て、そのオブジェクトの値を埋め込みます。この新しい動的割り当てオブジェクトはmainに割り当てられたlist l;とは無関係です。

混乱を避けるために、異なる変数を使用することをお勧めします。異なる変数をmainに置き換えると、異なるオブジェクトを参照する可能性があります。あなたが行l=malloc(sizeof(list));を削除する場合

、その後、init内のコードの残りの部分はmainにdefindたあなたのlist l;を更新され、あなたが期待される出力が表示されるはずです。

関連する問題