2016-10-16 2 views
-1

Ich bin im Moment ziemlich verwirrt mit Zeigern, so hoffe ich, jemand kann mir helfen, wo ich den Fehler mache.Setzen Zeiger Inhalt aus einer Liste von Zeigern in C

Also ich möchte eine Liste von Zeigern auf einige Strukturen haben, und eine Variable mit Zeigern auf alle von ihnen. Diese Liste sollte später auch auf einigen Bedingungen basieren und diese ändern. Also hier nur ein minimales Beispiel:

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); 
} 

Also mein Problem ist, in meiner Methode habe ich nur meine alle Variable und ich möchte diese ein verwenden, um meine ersten Zeiger zu ändern (hier eno und second_path), so setzte sie zum Beispiel zu NULL. Aber wenn ich es tun, wie ich es oben getan habe, ist der erste Zeiger des zweiten Pfades nicht null, sondern bleibt gleich ...

+2

Ist 'all-> all_paths [1] _path = NULL;' ein Tippfehler? Was soll es sein (es sollte einen Fehler geben wie es ist ..)? – Dmitri

+0

ja du hast recht, tut mir leid. Ich habe gerade den Post – malajedala

Antwort

0

In diesem Set-up, die nur Weg eno und second_path auf NULL zu setzen ist: Keine Manipulationen

eno = NULL; 
    second_path = NULL; 

mit one und seine internen Zeiger kann das tun, weil one enthält keine Informationen über Variableneno und second_path. Es enthält nur eine Kopie dessen, was auch eno und second_path enthält, nämlich Adressen von zwei Malloc'd-Strukturen. Das Hantieren mit Kopien hat keine Auswirkungen auf die Originale.

+0

bearbeitet, wenn ich also die Variablen des Pfades auf einen Wert setzen würde, dann würde 'all-> alle_Pfade [1] = NULL' second_path auch auf null setzen ?? – malajedala

+0

also, wenn ich second_path-> a = 10 hätte, oder so ähnlich ... – malajedala

+0

@malajedala Ich verstehe nicht, was Sie versuchen zu tun. Bitte aktualisieren Sie Ihre Frage mit spezifischeren Informationen. –

0

Um den Wert von second_path auf NULL zu setzen, indem Sie die Zeigerliste 'all' verwenden, sollte das Element 'all-> all_paths [1]' vom Typ (path **) sein, der auf die Adresse von zeigt der Zeiger second_path. Die Variable 'all-> all_paths' ist wie eine Tabelle, deren Elemente die Zeiger auf Zeiger vom Typ 'Pfad' sind. Um den Wert von second_path auf NULL zu setzen, können Sie die Anweisung '* (all-> second_path [1]) = NULL'

verwenden. Das Feld 'all_paths' der Struktur 'has_them' sollte vom Typ 'path' sein ***' (drei Sterne). Und einige Änderungen sollten an dem Code vorgenommen werden. Hier

ist der Code, es kompiliert und funktioniert gut:

#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); 
} 

Vergessen Sie nicht, alle zu befreien, die dynamisch zugewiesenen Variablen, wenn Sie sie nicht mehr benötigen.

+0

Omg du hast Recht, das macht Sinn. Also kann ich mich erinnern, dass, wenn ich andere Zeiger verwenden möchte, um meine anfänglichen zu ändern, ich immer eine Zeigerdimension mehr brauche? – malajedala

+0

vielen Dank für das Beispiel – malajedala