2016-10-16 9 views
-1

今はポインタとかなり混乱しているので、誰かが私がどこにエラーを起こしているのか助けてくれることを願っています。ポインタのリストからCのポインタの内容を設定する

私はいくつかの構造体へのポインタのリストと、それらのすべてへのポインタを持つ変数のリストを持っています。このリストは後でいくつかの条件に基づいて設定し、それらを変更する必要があります。だからここだけの最小限の例:

typedef struct { 
int a; 

} path; 

typedef struct { 

path** all_paths; 

} has_them; 

int main(int argc, char** argv){ 

path* eno = malloc(sizeof(path)); 
path* second_path = malloc(sizeof(path)); 

has_them* all = malloc(sizeof(has_them)); //this list should have all of my allocated path pointers 
all->all_paths = malloc(sizeof(path*)*10); 
all->all_paths[0] = eno; 
all->all_paths[1] = second_path; 

printf("%p und %p\n", eno, second_path); 
printf("%p und %p\n", all->all_paths[0], all->all_paths[1]); 

all->all_paths[1] = NULL; 

printf("%p und %p\n", eno, second_path); 
printf("%p und %p\n", all->all_paths[0], all->all_paths[1]); 

return (EXIT_SUCCESS); 
} 

だから私の問題であり、私の方法で私は私のすべての変数を持っていると私は私の最初のポインタ(ここではENOとsecond_path)を変更するには、このいずれかを使用したいので、それらを設定しますたとえばNULLに設定します。このセットアップ、NULLにenosecond_pathを設定するだけように が、私は上記のそれをしなかったように私はそれを行う際に、第二の経路の最初のポインタがnullではありませんが、同じまま...

+2

'all-> all_paths [1] _path = NULL;は入力ミスですか?それは何であるはずですか(それは..のようなエラーを与えるはずです)? – Dmitri

+0

はい、それは残念です。私は投稿 – malajedala

答えて

0

次のとおりです。

eno = NULL; 
    second_path = NULL; 

one変数enosecond_pathに関する情報が含まれていませんので、何oneで操作し、その内部ポインタがそれを行うことはできません。 enosecond_pathにも2つのmallocの構造体のアドレスが含まれています。コピーの手抜きはオリジナルには影響しません。

+0

を編集したので、パスの変数をいくつかの値に設定すると、 'all-> all_paths [1] = NULL'もsecond_pathにNULLを設定します?? – malajedala

+0

もし私がsecond_path-> a = 10、またはそのようなものを持っていたら... – malajedala

+0

@malajedalaあなたは何をしようとしているのか分かりません。より具体的な情報で質問を更新してください。 –

0

実際、ポインタの 'all'リストを使用してsecond_pathの値をNULLに設定するには、 'all-> all_paths [1]'要素のアドレスを指すタイプ(path **)にする必要があります。ポインタsecond_path。 変数 'all-> all_paths'は、要素が 'path'型のポインタへのポインタであるテーブルのようなものです。また、second_pathの値をNULLにするには、 '*(all-> second_path [1])= NULL'という文を使用することができます。

構造体 'has_them'のフィールド 'path'は、 'path ***(3つ星)。コードにいくつかの変更を加える必要があります。ここで

がコードである、それはコンパイルし、正常に動作します:あなたは、もはやそれを必要としないとき

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
int a; 

} path; 

typedef struct { 

path*** all_paths; 

} has_them; 

int main(int argc, char** argv){ 

path* eno = malloc(sizeof(path)); 
path* second_path = malloc(sizeof(path)); 

has_them* all = malloc(sizeof(has_them)); //this list should have all of my allocated path pointers 
all->all_paths = malloc(sizeof(path**)*10); 
all->all_paths[0] = (path**)&eno; 
all->all_paths[1] = (path**)&second_path; 

printf("%p und %p\n", eno, second_path); 
printf("%p und %p\n", *(all->all_paths[0]), *(all->all_paths[1])); 

//The second element of all->all_paths is nulled here 
*(all->all_paths[1]) = NULL; 

printf("%p und %p\n", eno, second_path); 
printf("%p und %p\n", *(all->all_paths[0]), *(all->all_paths[1])); 

return (EXIT_SUCCESS); 
} 

は、すべての動的に割り当てられた変数を解放することを忘れないでください。

+0

あなたは正しいです、これは意味があります。私は最初のものを変更するために他のポインタを使用したいと思うとき、私はいつもより多くのポインタ次元を必要とすることを覚えていますか? – malajedala

+0

ありがとうございました – malajedala

関連する問題