Ошибки сегментации strsep в различных типах указателей строк / массивов - PullRequest
1 голос
/ 20 октября 2010

Платформа: Linux, OSX
Компилятор: GCC

У меня есть простая программа, которая в настоящее время меня смущает - я знаю, что я работаю с парой различных типов массивов / указателей насоздать эту проблему - ее намеренное намерение - я пытаюсь ее понять.

Код, указанный в списке, будет скомпилирован и запущен, как и ожидалось, но при вызове data4 при вызове strsep(&data4, "e"); будет data1 или data3 вызывает ошибку сегментации.Я хотел бы понять, почему.

#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;
}

1 Ответ

5 голосов
/ 20 октября 2010

изменение data4 в вызове strsep (& data4, "e"); к data1 или data3 вызывает ошибку сегментации.

В этом случае:

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

строка, на которую указывает data1, является литералом, поэтому ее нельзя изменить. Когда strsep() пытается поместить в него '\ 0', segfault.

в другом случае:

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

data3 - это массив, а не указатель (хотя массивы легко оценивают по указателям, они на самом деле не являются указателями), поэтому strsep() не может обновить значение указателя, которое он пытается сделать, как только найдет знак Я получаю следующее предупреждение от gcc, пытающегося указать на это:

test.c:17: warning: passing argument 1 of 'strsep' from incompatible pointer type
...