Frage

Plattform: Linux, OSX
Compiler: GCC

Ich habe ein einfaches Programm bekam die derzeit mir Verwechselung ist - ich weiß, dass ich mit ein paar verschiedene Arten von Arrays / Zeiger bin durcheinander, dieses Problem zu produzieren - seine vorsätzliche -. Ich versuche es zu verstehen,

Der Code als aufgelistet kompiliert und wie erwartet laufen, aber data4 im Aufruf von strsep(&data4, "e"); zu data1 oder data3 Wechsel erzeugt einen Segmentation Fault. Ich möchte verstehen, warum.

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

int main(int c, char** v) {
    char* data1 = "hello\0";
    char* data2 = strdup(data1);
    size_t sz = strlen(data1);
    char data3[sz+1];
    char* data4;

    memset(data3, 0, sz+1);
    data4 = strncpy(data3, data1, sz);
    data4[sz] = '\0';

    char* found = strsep(&data4, "e");

    if (found == NULL) {
        printf("nothing found\n");
    } else {
        printf("found e\n");
    }

    return 0;
}
War es hilfreich?

Lösung

data4 im Aufruf strsep Wechsel (& data4, "e"); zu data1 oder data3 erzeugt einen Segmentation Fault.

In diesem Fall:

char* found = strsep(&data1, "e");

der String, auf den data1 ist ein wörtliche, damit es nicht geändert werden kann. Wenn strsep() versucht, Ort eines '\ 0' hinein, segfault.

im anderen Fall:

char* found = strsep(&data3, "e");

data3 ist ein Array, kein Zeiger (obwohl Arrays leicht auf Zeiger zu bewerten, sie sind nicht wirklich Zeiger), so strsep() nicht den Wert des Zeigers aktualisieren kann, das ist, was es versucht zu tun, sobald er das Token findet. Ich erhalte die folgende Warnung aus gcc versuchen, diese darauf hinweisen:

test.c:17: warning: passing argument 1 of 'strsep' from incompatible pointer type
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top