2017-03-25 5 views
0

Ich habe Stunden damit verbracht, das Internet nach Hilfe zu durchsuchen. Ich bin sehr viel Anfänger bei der Verwendung von Zeigern, und ich bin schon auf eine Wand gestoßen: Ich bekomme immer den Fehler Segmentation fault (core dumped). Ich versuche, eine einfache Version von strncpy zu machen() mit Zeigern:grundlegende Zeiger verwenden: Segmentierung Fehler, Core Dumped

int main(int argc, char *argv[]) { 
    char *x = "hello";     /* string 1 */ 
    char *y = "world";     /* string 2 */ 
    int n = 3;       /* number of characters to copy */ 

    for (int i=0; i<=n; i++) { 
     if(i<n) { 
     *x++ = *y++;     /* equivalent of x[i] = y[i] ? */ 
     printf("%s\n", x);    /* just so I can see if something goes wrong */ 
     } else { 
     *x++ = '\0';     /* to mark the end of the string */ 
     } 
    } 
} 

(Edit: Ich initialisiert x und y, aber immer noch die gleichen Fehler.)

Während auf der Suche nach Figur Sie heraus, was einen Teil davon war falsch, habe ich versucht, eine andere einfache Zeiger Sache:

int main(int argc, char *argv[]) { 
    char *s; 
    char *t; 
    int n;        /* just initilaizing everything I need */ 

    printf("Enter the string: "); 
    scanf("%s", s);      /* to scan in some phrase */ 
    printf("%s", s);      /* to echo it back to me */ 
} 

und siehe da, ich habe eine andere Segmentation fault (core dumped)! Es ließ mich "hello" einlesen, antwortete aber mit dem Fehler. Dieser Code ist so einfach. Was ist falsch mit meinem Zeiger hier zu verwenden?

+1

A 'char *' zuteilt keinen Speicher für die Zeichenfolge, nur einen Zeiger auf Speicher. – bejado

+1

Beratung: mehr Hintergrund lesen auf Konzepte auf C vor dem Fortfahren –

+0

Danke Leute! @ Giorgimoniava Ich habe seit Stunden gelesen, leider, haha! Ich versuche (: –

Antwort

0

In Ihrem zweiten Beispiel weisen Sie tatsächlich keinen Speicher zu. char *s weist nur einen Zeiger einem char zu. Sie müssen irgendwie Speicher zuweisen:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    char s[100]; 
    printf("Enter the string: "); 
    scanf("%s", s);      /* to scan in some phrase */ 
    printf("%s", s);      /* to echo it back to me */ 
} 

char s[100] erklärt Speicher auf dem Stapel, die automatisch freigegeben wird. Wenn Sie auf dem Heap zuweisen möchten, verwenden malloc/free:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) { 
    char *s = malloc(100 * sizeof(char)); 
    printf("Enter the string: "); 
    scanf("%s", s);      /* to scan in some phrase */ 
    printf("%s", s);      /* to echo it back to me */ 
    free(s); 
} 

Natürlich sind diese einfachen Beispiele setzen voraus, die Zeichenfolge nie länger als 100 Zeichen sein.

Ihr erstes Beispiel schlägt auch aus einem anderen Grund fehl.

Diese Anweisungen weisen Strings im schreibgeschützten Speicher zu und können daher nicht geändert werden.

+0

Danke! Ich vermute, ich sollte etwas Speicher zuweisen mit malloc? Auch, wie könnte ich sie schreibbar machen? –

+0

@ KaiC-m Sie können entweder 'malloc' oder ein Array deklarieren von 'char's auf dem Stapel.Wenn Sie' malloc' verwenden, sollten Sie den Speicher anschließend "freigeben"! – bejado

0

Wenn Sie Zeiger auf Zeichenfolge verwenden, beachten Sie immer, dass Sie es nicht ändern können. Das bedeutet, dass Sie die Zeichenfolgen nicht ändern können. In Pointer to string geht string immer nur in den Speicher. Es bedeutet, dass der Speicher nur gelesen werden kann, um ihn nicht zu ändern. Diese Anweisung verursacht Segment Fehler; -

*x++ = *y++; 

man kann dies auch tun; -

int *p="cool"; 
*p="a";   //dereferencing 
printf("%s",p); //segment fault 
Verwandte Themen