View Full Version : [c] aiuto banale calloc
fsdfdsddijsdfsdfo
31-01-2007, 22:40
ecco il sorgente
#include <stdio.h>
#include <stdlib.h>
int *p;
void next (int *p, int i)
{
p=calloc(i+1, sizeof(int));
p[i]=i;
}
int main()
{
int i;
for (i=0; i<10; i++) next(p, i);
for (i=0; i<10; i++) printf("%3d", p[i]);
printf("\n");
return 0;
}
vorrei scrivere un programma che metta 100 numeri successivi partendo da 0 in un vettore p e poi li stampi.
Ma vorrei che a ogni ripetizione allunghi il vettore di 1.
Come faccio? il codice cosi va in core dump. Grazie.
Mi spieghereste poi in pratica la differenza fra malloc e calloc?
prova a castare la calloc al tipo che ti interessa
p=(int*)calloc(i+1, sizeof(int));
perchè altrimenti calloc torna il puntatore ad un char.
malloc alloca un solo blocco alla volta della dimensione voluta.
fsdfdsddijsdfsdfo
31-01-2007, 23:58
ragazzi siete stati gentilissimi e chiarissimi... però il codice ancora non riesco a metterlo a posto
#include <stdio.h>
#include <stdlib.h>
int p[1];
void next (int *p, int i)
{
p=(int*)realloc(p, sizeof(int));
p[i]=i;
}
int main()
{
int i;
for (i=0; i<10; i++) next(p, i);
for (i=0; i<10; i++) printf("%3d", p[i]);
printf("\n");
return 0;
}
mi da:
*** glibc detected *** ./a.out: realloc(): invalid pointer: 0x08049654 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(__libc_realloc+0x31c)[0xb7e1aefc]
/lib/tls/i686/cmov/libc.so.6[0xb7e1b041]
/lib/tls/i686/cmov/libc.so.6(__libc_realloc+0x3c)[0xb7e1ac1c]
./a.out[0x80483dd]
./a.out[0x804841f]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7dc78cc]
./a.out[0x8048341]
======= Memory map: ========
08048000-08049000 r-xp 00000000 03:01 3443577 /home/lucrezia/lab/a.out
08049000-0804a000 rw-p 00000000 03:01 3443577 /home/lucrezia/lab/a.out
0804a000-0806b000 rw-p 0804a000 00:00 0 [heap]
b7da6000-b7db0000 r-xp 00000000 03:01 538576 /lib/libgcc_s.so.1
b7db0000-b7db1000 rw-p 00009000 03:01 538576 /lib/libgcc_s.so.1
b7db1000-b7db2000 rw-p b7db1000 00:00 0
b7db2000-b7edf000 r-xp 00000000 03:01 538584 /lib/tls/i686/cmov/libc-2.4.so
b7edf000-b7ee1000 r--p 0012c000 03:01 538584 /lib/tls/i686/cmov/libc-2.4.so
b7ee1000-b7ee3000 rw-p 0012e000 03:01 538584 /lib/tls/i686/cmov/libc-2.4.so
b7ee3000-b7ee7000 rw-p b7ee3000 00:00 0
b7ef3000-b7ef4000 rw-p b7ef3000 00:00 0
b7ef4000-b7f0d000 r-xp 00000000 03:01 540056 /lib/ld-2.4.so
b7f0d000-b7f0f000 rw-p 00018000 03:01 540056 /lib/ld-2.4.so
bf847000-bf85d000 rw-p bf847000 00:00 0 [stack]
ffffe000-fffff000 ---p 00000000 00:00 0 [vdso]
Aborted (core dumped)
ragazzi siete stati gentilissimi e chiarissimi... però il codice ancora non riesco a metterlo a postoCi sono alcune cose che non vanno:
a) Alla realloc tu passi la variabile locale 'p' (l'argomento della funzione) che come valore è l'indirizzo dell'array 'p' globale. Nota bene: alla realloc puoi solo passare o un puntatore NULL (nel qual caso si comporta come una malloc) oppure un qualunque altro valore che però deve essere stato ottenuto da una precedente malloc/calloc/realloc. Non puoi qundi passare alla realloc un qualunque puntatore di una generica variabile!!
b) Nella funzione next() il valore restituito dalla realloc lo assegni a 'p' ma quel 'p' è la variabile locale (l'argomento), non il 'p' globale. Pertanto la tua allocazione non serve a nulla .... in pratica si perde quando la funzione termina.
Spiega bene e meglio cosa vuoi fare, perché così come è il tuo programma non funziona e comunque ha poco senso.
ilsensine
01-02-2007, 10:57
Ci sono due errori seri:
- non puoi eseguire realloc su un puntatore statico!
- il parametro int *p modificato dalla funzione next viene perso all'uscita della funzione!
int p = NULL;
int *next (int *p, int i)
{
p = realloc(p, sizeof(int)*(i+1));
p[i] = i;
return p;
}
...
for (i=0; i<10; i++)
p = next(p, i);
Per curiosità, perché vuoi scrivere un codice così poco efficiente?
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.