Je sais qu'il ya des tonnes d'autres questions et réponses realloc et j'ai lu presque tous, mais je ne pouvais toujours pas réussi à résoudre mon problème.Comportement étrange sur Realloc: taille suivante invalide
j'ai décidé d'arrêter d'essayer quand j'ai découvert accidentaly un comportement très étrange de mon code. J'ai introduit une ligne pour essayer quelque chose, mais bien que je n'utilise pas la valeur de newElems
dans main, la ligne change le comportement.
Lorsque la ligne est commenté, le code échoue au premier realloc
. Y compris la ligne, le premier travail realloc. (Il se bloque toujours sur le second).
Des idées sur ce qui pourrait se passer?
int main(int argc, char** argv) {
Pqueue q = pqueue_new(3);
Node a = {.name = "a"}, b = {.name = "b"},
c = {.name = "c"}, d = {.name = "d"};
push(& q, & a, 3);
// the next one is the strange line: as you can see, it doesn't modify q
// but commenting it out produces different behaviour
Pqueue_elem* newElems = realloc(q.elems, 4 * q.capacity * sizeof *newElems);
push(& q, & b, 5);
push(& q, & c, 4);
char s[5];
Node* n;
for (int i = 1; i <= 65; ++i) {
sprintf(s, "%d", i);
n = malloc(sizeof *n);
n->name = strdup(s);
push(& q, n, i);
}
Node* current = NULL;
while ((current = pop(& q))) {
printf("%s ", current->name);
}
return 0;
}
et la fonction Push:
void push(Pqueue* q, Node* item, int priority) {
if (q->size >= q->capacity) {
if (DEBUG)
fprintf(stderr, "Reallocating bigger queue from capacity %d\n",
q->capacity);
q->capacity *= 2;
Pqueue_elem* newElems = realloc(q->elems,
q->capacity * sizeof *newElems);
check(newElems, "a bigger elems array");
q->elems = newElems;
}
// append at the end, then find its correct place and move it there
int idx = ++q->size, p;
while ((p = PARENT(idx)) && priority > q->elems[p].priority) {
q->elems[idx] = q->elems[p];
idx = p;
}
// after exiting the while, idx is at the right place for the element
q->elems[idx].data = item;
q->elems[idx].priority = priority;
}
La fonction pqueue_new:
Pqueue pqueue_new(unsigned int size) {
if (size < 4)
size = 4;
Pqueue* q = malloc(sizeof *q);
check(q, "a new queue.");
q->capacity = size;
q->elems = malloc(q->capacity * sizeof *(q->elems));
check(q->elems, "queue's elements");
return *q;
}
La "partie non pertinente" que vous avez supprimée peut très bien être la plus pertinente: je suppose que c'est là que vous écrivez des choses dans 'newElems', n'est-ce pas? – dasblinkenlight
Oui, et non. Je n'utilise pas newElements en dehors de cela, seulement q-> elems (qui a été assigné à newElems). Je vais l'inclure –
@CiprianTomoiaga Peu importe si vous écrivez dans le bloc pointé par 'newElems' ou' q-> elems', c'est le même bloc. L'erreur est susceptible d'être là. Utilisez valdrind pour le trouver plus rapidement. – dasblinkenlight