2012-06-24 4 views
0

J'ai des difficultés à implémenter Realloc de manière très basique.Realloc n'élargissant pas mon tableau

J'essaie d'élargir la région de mémoire à ** ret, qui pointe vers un tableau de struct avec ret = realloc(ret, newsize); et basé sur mes chaînes de débogage je sais NewSize augmente correctement au cours de la boucle (passant de la taille d'origine de 4 à 8 à 12 etc.), mais quand je le fais sizeof(ptr) il retourne toujours la taille d'origine de 4, et les choses que j'essaie de placer dans l'espace nouvellement alloué ne peuvent pas être trouvées (Je pense que je l'ai réduit à realloc() qui est la raison pour laquelle je suis en train de formater la question comme ça)

Je peux poster la fonction dans son intégralité si le problème n'est pas immédiatement évident pour vous, je suis juste essayer de ne pas "tricher" avec trop de devoirs (le code est en quelque sorte désordonné en ce moment, avec une utilisation intensive de printf() pour le débogage). D'accord, donc en fonction de vos réponses, je n'arrive pas à déboguer mon code, donc je suppose que je vais poster toute la fonction afin que vous puissiez m'en dire plus sur ce que je fais de mal.

(Vous pouvez ignorer le printf() 's puisque la plupart de qui est mise au point qui est même pas travailler)

Booking **bookingSelectPaid(Booking **booking) { 
    Booking **ret = malloc(sizeof(Booking*)); 
    printf("Initial address of ret = %p\n", ret); 
    size_t i = 0; 
    int numOfPaid = 0; 
    while (booking[i] != NULL) 
    { 
     if (booking[i]->paid == 1) 
     { 
      printf("Paying customer! sizeof(Booking*) = %d\n", (int)sizeof(Booking*)); 
      ++numOfPaid; 
      size_t newsize = sizeof(Booking*) * (numOfPaid + 1); 
      printf("Newsize = %d\n", (int)newsize); 
      Booking **temp = realloc(NULL, (size_t)newsize); 
      if (temp != NULL) 
       printf("Expansion success! => %p sizeof(new pointer) = %d ret = %p\n", temp, (int)sizeof(temp), ret); 
      ret = realloc(ret, newsize); 
      ret[i] = booking[i]; 
      ret[i+1] = NULL; 
     } 
     ++i; 
     printf("Sizeof(ret) = %d numOfPaid = %d\n", (int)sizeof(ret), numOfPaid); 
    } 
    return ret; } 

[EDIT2] ->http://pastebin.com/xjzUBmPg

[EDIT3] Juste pour soyez clair, le printf, le pointeur de temp et les choses de cette nature sont debug, et ne font pas partie de la fonctionnalité prévue. La ligne qui laisse perplexe moi est soit celui avec realloc(ret, newsize); ou ret[i] = booking[i]

Fondamentalement, je sais pour sûr que la réservation contient une table de struct, qui se termine par NULL, et je suis en train d'amener ceux qui ont un ensemble de valeur spécifique à 1 (payé) sur la nouvelle table, ce qui est ce que ma main() essaie d'obtenir de cette fonction ... Alors, où vais-je me tromper?

+0

Quelle est exactement la question ici? (Je ne vois pas de point d'interrogation n'importe où ...) –

+0

Je suppose que la question est: "Qu'est-ce que je fais de mal?" Fondamentalement, j'ai alloué '** ptr = malloc (sizeof (ma_structure *))' sans savoir combien d'instances de la structure seront dans mon tableau, puis basé sur une boucle, j'augmente une taille variable et en utilisant cela dans 'ptr = realloc (ptr, newsize)' mais je ne suis pas en mesure de placer plus de structs dans le tableau ... Je peux poster tout le code même au risque d'échouer mon cours si je Je suis trop ambigu, haha. – user1478361

+0

@ user1478361: La prochaine fois, utilisez 'code sample' pour le code au lieu de 'blockquote' (c'est dans la barre d'outils d'édition). Je l'ai réparé pour vous pour le moment. – Tim

Répondre

2

Je pense que le problème ici est que votre sizeof(ptr) ne renvoie que la taille du pointeur, ce qui dépend de votre architecture (vous dites 4, ce qui signifie que vous utilisez un système 32 bits).

Si vous allouez dynamiquement de la mémoire, vous devez vous-même en suivre la taille.

+0

J'ai mis à jour mon message initial pour inclure le code de la zone à problème. (Et puisque je ne comprends pas comment amener les caractères de contrôle avec moi sur stackoverflow, je l'ai aussi posté sur pastebin) [EDIT] Hm ... Et maintenant, il est correctement formaté tout d'un coup - eh bien, vous n'avez pas besoin de regarder pastebin maintenant je suppose – user1478361

+0

Il semble que votre 'i' pourrait devenir plus grand que' numOfPaid', ce qui signifie que 'ret [i]' et 'ret [i + 1]' pourraient être écrasés. –

+0

Même lorsque la table fournie par main n'a que 4 entrées, y compris le pointeur NULL? (Je peux poster un screencap de l'impression stdout dans la console si cela donnerait plus de perspicacité - même si mon débogage est partiellement faux) – user1478361

0

Parce sizeof(ptr) renvoie la taille de l'aiguille, et non pas la taille allouée

0

Yep, sizeof (ptr) est une constante. Comme l'indique l'autre réponse, cela dépend de l'architecture. Sur une architecture 32 bits, ce sera 4 et sur une architecture 64 bits, ce sera 8. Si vous avez besoin de plus d'aide pour des questions comme celle-ci, ce site Web peut être parfait pour vous.

Bonne chance.