Ich habe eine dornige C-Syntax Frage. Ich baue ein Array von verknüpften Listen auf, wobei jeder Knoten in einer Liste durch eine Struktur repräsentiert wird. Jede Struktur hat einen String, der später wichtig ist:Deref einen C-Zeiger auf eine Zeichenfolge innerhalb einer Struktur innerhalb eines Arrays?
// "linkedList.h"
typedef struct llnode listnode;
struct llnode {
char* data; // string
// ...and other data
};
Mein Code erstellt eine Tabelle von Zeigern auf dieses „listnodes“ und setzt all diese Zeiger auf NULL, aus Gründen, über den Rahmen dieses Beitrags:
void initTable(listnode** table){
// Initialize all pointers in the table to NULL
for (int i = 0; i < TABLESIZE; i++)
table[i] = NULL;
}
int main(){
// Create table of linked lists
listnode** table = (listnode**) malloc(TABLESIZE * sizeof(listnode*));
initTable(table);
return 1;
}
So weit, so gut. Später stopft mein Programm Daten in die Tabelle und fügt sie bei Bedarf der rechten Liste hinzu. Der Code zu tun, das funktioniert, aber ich werde eine stark vereinfachte Version hier aus Gründen halten meinen Beitrag so kurz wie möglich darbringen:
void insert(listnode** table, int index, char* newData){
if(*(table+index)==NULL){
// Create the new Node
listnode *newNode = NULL;
newNode = (listnode*)malloc(sizeof(listnode)); // allocate for the struct
newNode->data = (char*)malloc(sizeof(char)*15); // allocate for the string within the struct
strcpy(newNode->data, newData); // copy newData into newNode->data
// Insert node into table (Super simple version)
*(table+index) = newNode;
}
}
int main(){
listnode** table = (listnode**) malloc(TABLESIZE * sizeof(listnode*));
initTable(table);
insert(table, 0, "New String A");
insert(table, 5, "New String B");
insert(table, 7, "New String C");
return 1;
}
Das alles funktioniert super. Nun zu meiner eigentlichen Frage ... Angenommen, ich möchte in den Tisch greifen und eine dieser Strings dereferenzieren?
void printTable(listnode** table){
for(int i=0; i<TABLESIZE; i++){
if(*(table+i)==NULL)
printf("table[%d] == NULL\n", i);
else
printf("table[%d] == %s\n", i, **(table+i)->data); // << PROBLEM IS HERE!
}
}
int main(){
// create & initialize the table, as above
// insert data into the table, as above
printTable(table);
return 1;
}
Der Compiler nicht mag meine Syntax:
$ gcc -Wall linkedList.c
linkedListc: In function ‘printTable’:
linkedList.c:31:48: error: request for member ‘data’ in something not a structure or union
printf("table[%d] == %s\n", i, **(table+i)->data);
^
$
So weiß ich, das ist irgendwie eine lange Aufzug Voraussetzung für eine einfache Frage, aber kann mir jemand helfen mit der richtigen Syntax hier? Ich habe eine Reihe von syntaktischen Variationen ausprobiert, ohne Glück.
Mehr rätselhaft, wenn ich den Code ein wenig zu kompilieren, dann schauen Sie sich dies in GDB, ich kann sehen, dass **(table+i)
ist meine Struktur, noch **(table+i)->data
ist nicht zugänglich. Hier ist die GDB-Ausgabe, wenn ich das (modifizierte) Programm debugge; Der Knoten, der "Neue Zeichenfolge A" darstellt, wird zuerst an Index 0 in der Tabelle eingefügt. :
31 printf("table[%d] == %d\n", i, **(table+i));
(gdb) p *(table+i)
$1 = (listnode *) 0x6000397b0
(gdb) p **(table+i)
$2 = {data = 0x6000397d0 "New String A"}
(gdb) p **(table+i)->data
Cannot access memory at address 0x4e
(gdb)
Ich bin wirklich darüber verwirrt. Sobald ein C-Zeiger mehr als eine Dereferenzierungsschicht durchläuft, werde ich schielen. Wer weiß, wie die richtige Syntax hier aussehen könnte?
Dank einer Million, -Pete
PS - Apologies für den superlangen Beitrag. Ich schwöre, ich hatte Mühe, es überschaubar zu halten ...
Erstens, anstatt sie null zu setzen, warum nicht Calloc? Zweitens ist es nicht Ihre Syntax, dass das Objekt falsch ausgerichtet ist - versuchen Sie einen Cast. – cat
Ich denke nicht, dass Ihre Beispiele ausreichen, um dies zu reproduzieren, um eine Antwort zu schreiben, in Betracht ziehen, eine [mcve] – cat