2012-03-29 18 views
0
struct list{ 
    char *Name; 
}; 

void chekFC(struct list *newList){ 
    char *fC = newList->Name; 
    printf("%s\n", &fC);     //I can print it 
    if(fC[0] == '+')      //Any error?? 
    printf("Yes"); 
} 

int main(){ 
    struct list *newList = (struct list *)malloc(sizeof(struct list)); 
    newList->Name = "+abc"; 
    chekFC(newList); 
} 

kann es laufen, wenn ich den Code ändernc char Zeiger vergleichen

zu folgenden
void chekFC(struct list *newList){ 
    char *fC = newList->Name; 
    printf("%s\n", &fC);     //I can print it 
    if(fC[0] == '+') {}      // Add {} nothing run in the if condition, than the program can run 
    printf("Yes"); 
} 

Warum kann dieses Programm nicht ausgeführt? Der Fehler ist Segmentierungsfehler (Core Dumped)

+0

Sie haben wahrscheinlich nie 'newList-> Name' initialisiert ... – Mysticial

+1

Es ist unmöglich zu sagen, was genau an diesem Codefragment falsch ist. Bitte posten Sie das kleinste vollständige Programm, das das Problem aufweist. – Spire

+0

Zeigen Sie den vollständigen Code, speziell das Bit, das 'newList-> Name' zuweist –

Antwort

1

es in Sie Code haben ein Problem bedeuten.

printf("%s\n", &fC); 

sollten Sie es auf

printf("%s\n", fC); 

ändern Ich denke, du nicht das C-Zeiger verstehen sehr deutlich. die & fC ist sehr verschieden von fC, können Sie es durch "% p" drucken, um es zu sehen.

printf("fC %p, &fC %p\n", fC, &fC); 

& fC ist die Adresse von fC, fC ist Adresse des Strings von "+ abc". Ich möchte, dass es Ihnen helfen kann, aber ich schlage vor, Sie sollten ein Buch lesen, um C-Zeiger zu lernen.

+0

Vielen Dank –

+0

Sie haben Recht. Ich habe ein sehr schlechtes Konzept über C-Zeiger. –

1

Sind Sie sicher, dass newList->Name zugeordnet wurde?

+0

Ich denke schon. Weil ich Name aus der neuen Liste ausdrucken kann. –

+0

von printf ("@@% s \ n", & newList-> Name); –

+0

@Andreas, ist nicht die Zeile newList-> Name = "+ abc"; eine Zuordnung im Textsegment? –

1

newList-> Name wurde noch nie vergeben.

+0

Ich denke, ich habe es bereits zugewiesen –

+0

@dexametason, ist nicht die Zeile newList-> Name = "+ abc"; eine Zuordnung im Textsegment? –

+0

Er ändert es nicht, also ist es in Ordnung. Der Zeiger sollte gültig sein. – dragonx

1

konsequent Um solche Probleme in Zukunft zu vermeiden, ich Behauptungen empfehlen:

assert(newList); 
assert(newList->Name); 
0
printf("%s\n", &fC); 

falsch ist, werden Sie wahrscheinlich

printf("%s\n", fC); 
+0

Ich kann das Programm nicht ausführen, wenn ich printf ändere ("% s \ n", fC); –

+0

Segmentierungsfehler (Core Dumped) –

+0

Dies ist wahrscheinlich die Tatsache, dass Sie die Rückgabe von 'malloc' übertragen, weil Sie das richtige' # include' dafür vermissen. –