2010-10-19 20 views
1

Plate-forme: Linux, OSX
compilateur: GCCerreurs de segmentation strsep sur différents types pointeur/tableau chaîne

J'ai un programme simple qui est actuellement me confondait - je sais que je suis déconner avec un couple différents types de tableaux/pointeurs pour produire ce problème - son intentionnel - j'essaie de le comprendre.

Le code comme indiqué compilera et exécuter comme prévu, mais en changeant data4 dans l'appel à strsep(&data4, "e"); à data1 ou data3 provoque une erreur de segmentation. Je voudrais comprendre pourquoi.

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

Répondre

5

changer données4 dans l'appel à strsep (& données4, "e"); à data1 ou data3 provoque une erreur de segmentation.

Dans ce cas:

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

la chaîne pointée par data1 est un littéral ne peut donc pas être modifié. Lorsque strsep() essaie de placer un '\ 0' dedans, segfault.

dans l'autre cas:

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

data3 est un tableau, pas un pointeur (même si les tableaux évaluent facilement des pointeurs, ils ne sont pas en fait des pointeurs), donc strsep() ne peut pas mettre à jour la valeur du pointeur qui est ce qu'il essaie de faire une fois qu'il trouve le jeton. Je reçois l'avertissement suivant de gcc essayant de le signaler:

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