|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Registered User
Iscritto dal: Sep 2002
Messaggi: 1025
|
[c] aiuto banale calloc
ecco il sorgente
Codice:
#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? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
prova a castare la calloc al tipo che ti interessa
Codice:
p=(int*)calloc(i+1, sizeof(int)); malloc alloca un solo blocco alla volta della dimensione voluta. |
|
|
|
|
|
#3 |
|
Registered User
Iscritto dal: Sep 2002
Messaggi: 1025
|
ragazzi siete stati gentilissimi e chiarissimi... però il codice ancora non riesco a metterlo a posto
Codice:
#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;
}
Codice:
*** 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) |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
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.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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! Codice:
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);
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 01-02-2007 alle 10:59. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:35.



















