2010-06-15 4 views
1

J'ai un problème avec mon petit programme C. Peut-être pourriez-vous m'aider.Erreur de segmentation lors de l'écriture de char sur l'adresse char *

char* shiftujVzorku(char* text, char* pattern, int offset){ 
    char* pom = text; 
    int size = 0; 
    int index = 0; 
    while(*(text + size) != '\0'){ 
     size++; 
    } 
    while(*(pom + index) != '\0'){ 
     if(overVzorku(pom + index, pattern)){ 
      while(*pattern != '\0'){ 
       //vyment *pom s *pom + offset 
       if(pom + index + offset < text + size){ 
        char x = *(pom + index + offset); 
        char y = *(pom + index); 
        int adresa = *(pom + index + offset); 
        *(pom + index + offset) = y; // SEGMENTATION FAULT 
        *(pom + index) = x; 
        //*pom = *pom - *(pom + offset); 
        //*(pom + offset) = *(pom + offset) + *pom; 
        //*pom = *(pom + offset) - *pom; 
       } 
       else{ 
        *pom = *pom - *(pom + offset - size); 
        *(pom + offset - size) = *(pom + offset - size) + *pom; 
        *pom = *(pom + offset - size) - *pom; 
       } 
       pattern++; 
      } 
      break; 
     } 
     index++; 
    } 
    return text; 
} 

N'est pas important ce que fait le programme. Peut-être qu'il y a beaucoup de bugs. Mais, pourquoi ai-je une DÉFAUT DE SEGMENTATION (pour la destination voir le code) sur cette ligne? Je suis, en essayant d'écrire de la valeur de char à l'espace mémoire, avec l'aide de l'adresse "pom + offset + index". Merci pour tout utile. :)

+0

Peut-être que l'appelant ne passe pas dans un pointeur vers la mémoire en lecture seule. Peut-être que l'appelant ne passe pas dans un pointeur vers * suffisamment * de mémoire en lecture seule. Qui sait? –

+1

ce code me fait mal aux yeux quand je le lis. Je commencerais par casser le code en parties logiques, les mettre dans des fonctions séparées, puis vérifier à nouveau. – stijn

+0

Vous pouvez utiliser un débogueur, comme gdb pour analyser le problème. Je pense qu'il est plus important pour vous d'apprendre comment résoudre ces problèmes que de recevoir une réponse de notre part. Je –

Répondre

2

Êtes-vous par hasard appeler le code comme ceci:

shiftujVzorku("foobar", "xx", 0); 

Si oui, votre code tente d'écrire un caractère littéral, ce qui est illégal en C. Vous devriez plutôt faire:

char buf[] = "foobar"; 
shiftujVzorku(buf, "xx", 0); 
+0

très bien, merci beaucoup! Je travail. –

+2

Un commentaire sur la conversion de "char const *" en "char *" peut être utile pour expliquer pourquoi il a compilé mais s'est écrasé. –

0

Parce que l'adresse que pom + SIZE points + index pour n'est pas un emplacement de mémoire que votre programme est autorisé à écrire. Choses à vérifier: 'text' est-il un tampon légitime quelconque? C'est juste passé, donc il n'y a aucune idée dans le code donné d'où il vient. L'avez-vous fait? Est-ce que c'est sur la pile quelque part? En outre, est-il réellement terminé par NUL quand il entre?

+0

appelant cette fonction: char * a = "abcd"; char * b = "b"; shiftujVzorku (a, b, 1); en mode dbg, je peux voir cette adresse "pom + taille + index" voit quelque chose à l'intérieur de la chaîne "ABCD", omble chevalier x = * (pom + index + offset); // est représenté par 'c' Je pense qu'il n'y a aucune raison d'être en dehors de l'espace mémoire disponible. –

0

Je pense Peu importe ce que le programme est en train de faire, ou au moins quels paramètres la fonction prend. En ce moment, il semble que le problème est que vous boucle index jusqu'à pom + index des points à la fin de la chaîne, mais vous essayez d'accéder pom + index + offset, ce qui est après la fin de la chaîne. Ou peut-être offset est négatif?

+0

params sont certainement bien :) pls voir mon commentaire précédent pour des informations détaillées. –

+0

problème était, que de la déclaration de: char * x = "....", x est pointeur sur la séquence const de caractères, vous pouvez écrire ou modifier l'un de ces caractères en utilisant * x –

+0

@Lukas: Il est un peu tard, mais bon de savoir que vous avez résolu le problème. –

0

Quel gâchis!

Quoi qu'il en soit, le problème vient du décalage je pense. Vous ne vérifiez même pas que * (pom + index + offset) est l'emplacement mémoire que vous pouvez utiliser. Peut-être que c'est après le '\ 0' de votre texte.

Vous devez comparer la taille et l'indice + offset avant d'essayer d'utiliser * (pom + index + offset).