2016-05-11 10 views
-4

Ich habe diese zwei Arrays, Codeblocks gibt mir keinen Build-Fehler, aber jedes Mal, wenn ich es führe, gibt es "Segmentation Fehler" und es schließt das Programm, ich habe es debuggt und gefunden out Ich kann Werte von names1 auf diese Weise nicht ändern, aber names2 ändern dieser Weg funktioniert gut, gibt es eine Möglichkeit, dies zu tun? Wenn ja wie mache ich troca arbeiten für names1?Ändern von Zeichenfolgen in Array von Zeichenzeiger

void troca(char* frase){ 
    unsigned i=0; 
    while(*(frase+i)!='\0') { 
     if(*(frase+i)=='O') { 
      *(frase+i)='0'; 
     } 
    i++; 
    } 
} 

int main(){ 
    char *names1[]={"JOAO","MANUEL","ROBERTO","ZE"}; 
    char names2[][51]={"JOAO","MANUEL","ROBERTO","ZE"}; 
    unsigned i; 
    for(i=0;i<4;i++) { 
     troca(names2[i]); 
    } 
    return 0; 
} 
+4

google _string literals_ –

+0

Nicht relevant hier, aber ich habe irgendwo gelesen, dass zwei Variablen, die auf das gleiche String-Literal verweisen, den gleichen Speicher teilen. Die Änderung kann auch die andere ändern. – sjsam

+0

Bitte posten Sie den * tatsächlichen * Code als ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve). Offensichtlich war das nicht Ihr Code - wenn er nicht kompiliert wird, kann er keinen segfault erzeugen. –

Antwort

0

Der Unterschied ist:

names1 erklärt wird einfach als ein Array von Zeigern Zeichenfolge ohne andere Eigenschaften definiert. Wenn Sie hier String-Literale verwenden, werden die String-Literale in einen Abschnitt in Ihrer ausführbaren Datei geschrieben, der schreibgeschützt lautet, da der Compiler auf diese Weise sie wiederverwenden kann. Wenn Sie zum Beispiel char* a = "abc"; char* b = "abc"; verwenden, dann haben höchstwahrscheinlich a und b gleiche Speicheradressen als Werte. Das bedeutet, dass Sie sie nicht ändern können, daher erhalten Sie einen "Segmentierungsfehler" (ein anderer Name für denselben Fehler ist "Zugriffsverletzung").

names2 ist als ein Array von Arrays von Zeichen deklariert. Wenn Sie ein String-Literal zuweisen, werden die Daten der Strings in das Array kopiert, und da in Ihrem Code kein Code const im Spiel ist, muss das Array veränderbar sein, sodass wiederum Ihre in den Char-Arrays gespeicherten Strings änderbar sind .