2016-04-20 5 views
0

ich nicht in der Lage bin, die Ursache der Segmentierungsfehler zu lokalisieren Ziel-umkehren einen String ZeigerLage von Segmentierungsfehler

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

void swap(char *ptr[], int c) 
{ 
    int i; 
    char *r[40];  
    for(i=0; i<c; i++) 
    *(r[c-i]) = *(ptr[i]); 
    printf("%s",*r); 
} 

main() 
{ 
    int i; 
    char *ptr[20],str[40]; 

    printf("enter string:"); 
    gets(str); 
    for(i=0; i<(strlen(str)); i++) 
    ptr[i]=&(str[i]); 
    swap(ptr,strlen(str));  
} 
+2

Ich weiß nicht, warum Sie ein Array verwenden von String-Zeiger, aber trotzdem sollte 'r [ci]' 'r [ci-1] sein, wenn' c' die Array-Länge ist. Und dann machst du den klassischen "Heuler", indem du die Charaktere * zweimal * austauschst, anstatt in der Mitte zu bleiben. –

+1

Mögliches Duplikat von [Definitive Liste gemeinsamer Gründe für Segmentierungsfehler] (http://stackoverflow.com/questions/33047452/definitive-list-of-common-reasons-for-segmentation-faults) – CodeMouse92

Antwort

3

Problem mit liegt hier -

char *r[40];  
for(i=0;i<c;i++) 
    *(r[c-i])=*(ptr[i]); 

Hier erklären Sie Array von char Zeiger r und Sie Dereferenzierung dieser nicht initialisierten Zeiger, die Seg Fehler verursacht haben müssen.

-2

In Ihrem Code:

char *ptr[20],str[40];//ptr is an array of character arrays and str is a 1d character array 
for(i=0;i<(strlen(str));i++) 
ptr[i]=&(str[i]);//assining a character to an array 
swap(ptr,strlen(str));//ptr doesn't contain the copy of str, some other values 

This code causes error at: 

char *r[40];  
for(i=0;i<c;i++) 
*(r[c-i])=*(ptr[i]); 

Statt Unordnung, die Dinge so, können Sie den einfachen Code verwenden unter:

void swap(char ptr[],int c) 
{ 
    int i; 
    char r[40]; 
    for(i=0;i<c;i++) 
    r[c-i-1]=ptr[i]; 
    printf("%s",r); 
} 
int main() 
{ 
    int i; 
char ptr[20],str[40]; 
printf("enter string:"); 
gets(str); 
for(i=0;i<(strlen(str));i++) 
ptr[i]=str[i]; 
swap(ptr,strlen(str)); 
return 0; 
} 
+0

Es gibt ** nein * * 2d Char-Array überall. Und es ist 'int main' in C. – Jens

+0

@Jens, wir können void main ohne return irgendetwas oder int main verwenden, indem wir bei Erfolg 0 zurückgeben. Neuer Compiler erlaubt beide Fälle. Ja. Ich habe falsche Konventionen benutzt. Ich habe meine Antwort zum Zeichenarray bearbeitet. Danke, dass du mich verbessert hast. –

+0

Für eine gehostete C-Implementierung muss sie gemäß dem C-Standard "int main" sein (zB C11, 5.1.2.2.1: "[main] muss mit einem Rückgabetyp von' int' definiert sein [...] "). C ist nicht Java, und Sie können den Rückgabetyp von main nicht frei wählen, weil Sie nicht derjenige sind, der den code aufgerufen hat, der main aufruft (der Laufzeit-Startcode in crt0.o oder ähnlichem). – Jens