2010-10-27 4 views
2

EDIT: code mis à jour avec un nouveau lien Pastebin mais il s'arrête toujours à la boucle info-> citizens [x] -> while. Ajout de realloc aux boucles et rangement du code. Tous les autres commentaires seraient grandement appréciésC dépassement de mémoire (v2)

Je vais avoir quelques problèmes avec l'allocation de mémoire débordement

http://pastebin.com/vukRGkq9 (v2)

Peu importe ce que j'essaie, tout simplement pas assez de mémoire est allouée pour plus d'informations -> citizen et gdb disent souvent qu'il ne peut pas accéder à info-> citizens [x] -> name. À l'occasion, j'obtiendrai même des erreurs KERN_INVALID_ADDRESS directement après les instructions printf pour strlen (Strlen n'est pas utilisé dans le code au point où gdb s'arrête à cause de l'erreur, mais je suppose que printf utilise strlen d'une manière ou d'une autre). Je pense que c'est quelque chose à voir avec la façon dont la mémoire est allouée à la structure. Donc je me demandais si quelqu'un pouvait jeter un coup d'œil?

+0

Avez-vous essayé de réduire autant que possible le code afin que seules les lignes problématiques soient présentes? Il serait beaucoup plus facile d'enquêter, à la fois pour nous et pour vous. – mouviciel

+0

Que voulez-vous dire, "code mis à jour"? Voulez-vous dire que vous avez fait toutes les bonnes réponses à votre question, des réponses terribles parce qu'elles pointent maintenant vers des lignes qui ne sont pas là? Oh, oui, vous le faites, les deux versions sont assez différentes pour contenir des ensembles de bogues complètement différents. Eh bien ... –

Répondre

7

Vous ne devriez pas faire malloc(sizeof(PEOPLE*)), car il alloue exactement la quantité d'octets pour le pointeur (4 octets sur l'architecture 32 bits).
Semble que la chose que vous voulez faire est malloc(sizeof(PEOPLE) * N) où N est le maximum. nombre de personnes que vous voulez mettre dans ce morceau de mémoire.

3

Il est clair que le problème est lié à:

info->citizens = malloc(sizeof(PEOPLE *)); 
info->citizens[0] = malloc(sizeof(PEOPLE *)); 
info->citizens[1] = malloc(sizeof(PEOPLE *)); 

Pensez logiquement ce que vous essayez de faire ici.

+0

-1 Ceci est un site q & a pas un site q & think ... – Tomas

+4

Je ne suis pas d'accord, c'est une chose parfaitement valide pour donner un indice au lieu d'une réponse complète, surtout si la question est (subjectivement) triviale :) –

+0

+1 Donnez un poisson à un homme/apprenez à un homme à pêcher ... – dawg

0

Il semble que vous ayez trop de niveaux d'indirection. Pourquoi utilisez-vous **citizens au lieu de *? En plus du fait que vous allouez l'espace pour un pointeur, pas la structure, il y a quelques choses bizarres, comme la variable locale info à la ligne 31 signifie que l'allocation initiale est hors champ une fois le bloc se ferme à la ligne 34.

Vous devez réfléchir plus clairement aux données qui sont là.

0

Beaucoup de problèmes d'allocation de mémoire avec ce code. Ceux mentionnés ci-dessus ainsi que de nombreux autres, par exemple:

info->citizens[masterX]->name = malloc(sizeof(char)*strlen(dp->d_name)+1); 
info->citizens[masterX]->name = dp->d_name; 

Vous ne pouvez pas copier les chaînes en C par l'assignation (en utilisant =). Vous pouvez écrire cela comme:

info->citizens[masterX]->name = malloc(strlen(dp->d_name)+1); 
strcpy(info->citizens[masterX]->name, dp->d_name); 

Ou vous pouvez condenser toute allocation & copie comme suit:

info->citizens[masterX]->name = strdup(dp->d_name); 

De même au niveau des lignes 143/147 (sauf en ce cas, vous avez également alloué un octet trop peu dans votre appel malloc).

1

Votre struct devrait presque contient certainement pas des membres tels que:

time_t *modtimes; 
mode_t *modes; 
bool *exists; 

Au lieu de cela, vous devez simplement utiliser:

time_t modtimes; 
mode_t modes; 
bool exists; 

De cette façon, vous n'avez pas besoin de les allouer dynamiquement, ou par la suite libérer leur. Les raisons sont les suivantes: a) ils sont petits et b) leur taille est connue à l'avance. Vous serait utilisation:

char *name; 

pour un champ de chaîne, car ce n'est pas petit et vous ne savez pas à l'avance combien il est grand.

Ailleurs dans le code, vous avez la folllowing:

if(top) 
{ 
    PEOPLE *info; 
    info = malloc(sizeof(PEOPLE *)); 
} 

Si top est vrai, alors ce code attribue un pointeur, puis fuit immédiatement - la portée de la deuxième information est limitée à l'instruction if de sorte que vous ne pouvez ni l'utiliser plus tard, ni vous pouvez le libérer plus tard. Vous auriez besoin de faire quelque chose comme ceci:

PEOPLE *process(PEOPLE *info, ...) 
{ 
    if (top) 
    { 
    info = malloc(sizeof(PEOPLE)); 
    } 

    info->name = strdup("Henry James"); 
    info->exists = true; 
    return info; 
} 
Questions connexes