PDA

View Full Version : [C]puntatori e **argv


MEMon
05-03-2008, 15:06
Ho qualche problema coi puntatori, ecco il codice:

1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void test(char *args[], char *p){
5 p=args[1]; //args[1] dovrebbe essere un char *
6 }
7
8 main(int argc, char *argv[]){
9 char *p;
10 test(argv,p);
11 printf("%s\n",p);
12 }

Mi stampa delle schifezze e non quello che gli passo.
Non riesco a capire... p e un char *, args è un array di char * quindi args[n] è un char *.
p=args[1] è un char *=char * dovrebbe andare no?

andbin
05-03-2008, 15:17
Mi stampa delle schifezze e non quello che gli passo.'p' nel main è un puntatore non inizializzato (cosa contiene non si sa ... spazzatura). Alla funzione test() passi una copia del valore del puntatore. Ciò che assegni a 'p' in test non ha alcuna influenza su 'p' del main.

MEMon
05-03-2008, 15:19
Se passo a test l'indirizzo di p(&p) poi come mi devo comportare in test?

MEMon
05-03-2008, 15:20
Ah capito

1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void test(char *args[], char **p){
5 *p=args[1];
6 }
7
8 main(int argc, char *argv[]){
9 char *p;
10 test(argv,&p);
11 printf("%s\n",p);
12 }


Azz che roba...

MEMon
05-03-2008, 16:51
1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5
6
7
8 main(int argc, char *argv[]){
9 char *buffer;
10 buffer=(char *)malloc(80);
11 printf("%d\n", sizeof(buffer));
12 }

Mi da sempre 4, che credo sia la dimensione di NULL, infatti malloc sotto unix ritorna NULL se qualcosa va storto...ma cosa può essere andato storto?

andbin
05-03-2008, 16:57
Mi da sempre 4Perché sizeof di un puntatore dà 4 su un sistema a 32 bit (appunto puntatori a 32 bit).

MEMon
05-03-2008, 16:58
ah...e come faccio a sapere se buffer è stato allocato correttamente e se è della dimensione da me voluta?

andbin
05-03-2008, 17:04
ah...e come faccio a sapere se buffer è stato allocato correttamente e se è della dimensione da me voluta?malloc o ha successo ed alloca gli N byte richiesti oppure fallisce e ritorna NULL. Non ci sono altre possibilità.

wingman87
05-03-2008, 17:04
Controlli se buffer!=NULL. Se non è riuscito ad allocare lo spazio da te richiesto ritorna sempre NULL

MEMon
05-03-2008, 17:10
Ok capito, quindi non c'è modo di vedere quanto spazio occupa un array allocato dinamicamente.

Comunque, come mai questo codice non fa quel che deve:

1 #include <fcntl.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 main(int argc, char *argv[]){
6 char *buffer;
7 int nr=0;
8 int l=lseek(0,0L,SEEK_END);
9 buffer=(char *)malloc(l*sizeof(char)+1);
10 if(buffer==NULL){
11 printf("Impossibile allocare lo spazio per il buffer\n");
12 exit(1);
13 }
14 nr=read(0,buffer,l);
15 printf("%d_standard input[%d]:%s\n", nr,l,buffer);
16 }
In teoria dovrebbe leggere lo standar input e metterlo nel buffer, ma buffer mi sembra rimanga vuoto perchè mi stampa solo questo: "0_standard input[5]:".

ps.test.exe è il file compilato e lo invoco così: ./test.exe<prova dove prova è un file che contiene la stringa "ciao"(con anche il terminatore \0)

MEMon
05-03-2008, 17:21
Non è che buffer viene svuotato dalla read se si raggiunge l'end-of-file?

MEMon
05-03-2008, 17:30
Sono un asino, con il seek mi sposto alla fine senza poi rimetterlo all'inizio...