2017-12-20 3 views
2

Ich experimentiere mit C void-Funktionen und Zeichenketten. Ich habe dieses Programm versucht:C Das Drucken desselben Arrays führt zu zwei unterschiedlichen Ergebnissen.

#include <stdio.h> 
#include <string.h> 

void print(char** test); 
int main(){ 
    char* test = "abcdef"; 
    print(&test); 
    return 0; 
} 
void print(char** test){ 
    for(int i=0;i<strlen(*test);i++) 
     printf("%c\n",*test[i]); 
} 

Es ist für mich druckt die erste a A � dann Segmentation Fault. Aber nach der Änderung von *test[i] zu *(*test+i) was ziemlich genau das gleiche ist, funktioniert es für mich wie erwartet.

Gibt es einen feinen Unterschied *test[i] und *(*test+i) wenn nicht, warum funktioniert mein Code in zweiten Beispielen, während es nicht in der ersten?

+8

Dies ist ein [* Operator Vorrang *] (http://en.cppreference.com/w/c/language/operator_precedence) Problem. Der Array-Index-Operator '[]' hat eine höhere Priorität als der Dereferenzierungs-Operator '*'. Etwas, das ein [gutes Anfängerbuch] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list) Ihnen hätte sagen sollen (IMO). –

+4

Auch "ziemlich genau das Gleiche" ist * nicht * "* genau * dasselbe". Tatsächlich sind die beiden Ausdrücke, die Sie für "fast das Gleiche" halten, * nicht *. (Siehe meinen vorherigen Kommentar für warum). –

+2

Also um das zu beheben, kann ich '(* test) [i]'? –

Antwort

4

test ist ein char**. Wie Einige Programmierer Kumpel kommentiert, nimmt die [] Vorrang vor dem * so Ihre for-Schleife wie folgt ausgeführt:

  1. *test[0] == *(test[0]) == 'a'
  2. *test[1] == *(test[1]) == * (einige andere Adresse, die in gespeichert Speicher nach &test) => UB

Entweder man indirection im gesamten Programm verwenden (zB *, nicht ** und &test) oder verwenden Sie (*test)[i]

Verwandte Themen