strsep Segmentierungsfehler auf verschiedenen String-Zeiger / Array-Typen
-
09-10-2019 - |
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;
}
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