2009-10-09 9 views
1

-je obtenir l'erreur suivante dans mon C programme:Problèmes avec « Tas tampon » Erreur dans C

 
Writing to heap after end of help buffer 

Pouvez-vous me dire ce que je suis absent?

char * path_delimiter(char * path) 
{ 
    int i = 0, index = 0, size = 0, length = (int)strlen(path); 
    char *tmp, *ans; 

    for(; i < length; i++) { 
     if(path[i] == PATH_DELIM[0]) { 
      break; 
     } 
    } 
    i++; 
    size = (int)strlen(path) - i; 
    ans = (char*)malloc(sizeof(path)); 
    tmp = (char*)malloc(size); 
    strcpy(ans,path); 
    ans[i-1] = END_ARRAY; 

    if(size > 0) 
    { 
     strcpy(tmp,&path[i]); 
     realloc(path,size); 
     strcpy(path,tmp); 
    } 
    else 
    { 
     strcpy(path,ans); 
    } 
free(tmp); 

return ans; 
} 
+0

S'il vous plaît modifier pour formater votre code: Cliquez sur le lien 1010 et indenter chaque ligne de code 4 places - plus montrer indenter dans le code. – PTBNL

+2

Utilisez les espaces et les accolades. –

+3

Il serait utile de savoir ce que vous essayez de faire. Par exemple, que pensez-vous de 'malloc (sizeof (path))'? –

Répondre

5

Vous n'êtes pas vérifier si malloc et realloc réussi. Plus important encore, realloc peut renvoyer une poignée différente dont vous vous débarrassez.

De plus, vous avez:

ans = malloc(sizeof(path)); 
... 
strcpy(ans, path); 

Sur la plate-forme la plus commune aujourd'hui, sizeof(path) est le plus probable 4 ou peut-être 8, quelle que soit la longueur du tableau de caractères path points.

8

This ...

sizeof(path) 

... est le même que ...

sizeof(char *) 

... qui est la taille du pointeur (pas la taille de la mémoire tampon qui il pointe vers), il est donc probablement environ 4.

... donc, ce

ans= (char*)malloc(sizeof(path)); 

... est un tampon de 4 octets, et ainsi cette ...

strcpy(ans,path); 

... écrase par écriture (écriture après la fin de) ce tampon.

Au lieu de ...

malloc(sizeof(path)); 

... Je pense que vous voulez ...

malloc(strlen(path)+1); 
+1

À l'OP: S'il vous plaît, utilisez strncpy pour le moment. Cela vous épargnera beaucoup de maux de tête sur la route. – Calyth

+0

Cela ne devrait pas être: malloc (sizeof (char) * (strlen (chemin) +1)); Vous supposez que le caractère est de 1 octet. – Andrew

+2

Andrew, je pense que 'sizeof (char)' est toujours égal à 1, par définition. – ChrisW

0

Vous devez normalement size = strlen(xxx) + 1; pour permettre la terminaison nulle sur la chaîne.

Dans ce cas, je pense que vous avez besoin:

size = strlen(path) - i + 1; 
+0

que pour vous tout résoudre son problème ...mais pour être sûr quand j'utilise la méthode strlen j'ai besoin d'ajouter 1 pour le '\ 0' sinon pourquoi ai-je besoin du +1 merci encore –

+0

La fonction 'strlen()' compte le nombre de caractères dans la chaîne excluant le nul final. Lorsque vous allouez de la mémoire, vous devez allouer suffisamment de mémoire pour la chaîne, y compris la valeur nulle, ce qui correspond donc à 'strlen (quel que soit) +1' octet. –

Questions connexes