Juste pour le plaisir, j'ai implémenté ma propre pile, mais sans utiliser une liste chaînée, mais elle était toujours dynamique, parce que chaque fois que vous appuyez dessus, une taille plus grande ou plus petite, et puis le remplit avec ce qui était déjà là (et un de moins ou un de plus). Je comprends que c'est très lent et une façon stupide de le faire, mais je voulais juste voir si ça fonctionne.Erreur d'implémentation de pile bizarre
Le code est un peu long, donc je pastied il here:
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int size;
int *stack_array;
}stack;
void newStack(stack *a) {
a->size = 0;
a->stack_array = malloc(sizeof(int) * 1);
}
void push(stack *a, int x) {
int *new_array = malloc(sizeof(int) * a->size);
int i;
for(i=0; i < a->size; i++) {
new_array[i] = a->stack_array[i];
}
new_array[i] = x;
a->stack_array = new_array;
a->size += 1;
}
int pop(stack *a) {
if(a->size <= 0) {
printf("CALL POP() WITH FILLED STACK");
exit(1);
}
int *new_array = malloc(sizeof(int) * (a->size)-1);
int i;
for(i=0; i < a->size-1; i++) {
new_array[i] = a->stack_array[i];
}
int popped = a->stack_array[i];
a->stack_array = new_array;
a->size -= 1;
return popped;
}
void printStack(stack *a) {
int i;
printf("{");
for(i=0; i<a->size-1; i++) {
printf("%d, ", (a->stack_array)[i]);
}
printf("%d}\n", (a->stack_array)[i]);
}
int main (void) {
stack a;
newStack(&a);
push(&a, 6);
push(&a, 12);
push(&a, 13);
printStack(&a);
printf("Popped: %d\n", pop(&a));
printStack(&a);
return 0;
}
Et, comme vous pouvez le voir, cela fonctionne très bien.
Maintenant, quand j'ajouter une boucle à lui, pour ajouter un peu plus à la pile (pastied here):
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int size;
int *stack_array;
}stack;
void newStack(stack *a) {
a->size = 0;
a->stack_array = malloc(sizeof(int) * 1);
}
void push(stack *a, int x) {
int *new_array = malloc(sizeof(int) * a->size);
int i;
for(i=0; i < a->size; i++) {
new_array[i] = a->stack_array[i];
}
new_array[i] = x;
a->stack_array = new_array;
a->size += 1;
}
int pop(stack *a) {
if(a->size <= 0) {
printf("CALL POP() WITH FILLED STACK");
exit(1);
}
int *new_array = malloc(sizeof(int) * (a->size)-1);
int i;
for(i=0; i < a->size-1; i++) {
new_array[i] = a->stack_array[i];
}
int popped = a->stack_array[i];
a->stack_array = new_array;
a->size -= 1;
return popped;
}
void printStack(stack *a) {
int i;
printf("{");
for(i=0; i<a->size-1; i++) {
printf("%d, ", (a->stack_array)[i]);
}
printf("%d}\n", (a->stack_array)[i]);
}
int main (void) {
stack a;
newStack(&a);
int i = 0;
for(i = 0; i<12; i++) {
push(&a, i);
}
printStack(&a);
return 0;
}
Il fonctionne bien sur CodePad (qui me embrouille un peu plus), mais, ma machine, il me donne cette erreur (que je ne l'ai jamais vu auparavant, et est donnée lors de l'exécution):
a.out: malloc.c:3096: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted
il peut ou ne peut pas faire une différence que la machine exécutant c'est une machine Linux VirtualBox. Aussi, je n'ai évidemment pas très bien écrit l'implémentation, vu qu'elle ne libère pas de pointeurs, ni d'espace, ou ne vérifie pas beaucoup d'erreurs.
Veuillez poster le code ici; codebin.org expire.En regardant la source de malloc qui provoque l'assertion, la seule chose qui me frappe est que vous avez pu corrompre votre tas. Je vérifierais votre code pour les doubles-libres. –
Il semble que vous ayez une corruption de la mémoire. Essayez Valgrind pour voir où votre programme a fait quelque chose de mal. – sahaj
Comment vérifier avec valgrind? –