2013-08-21 14 views
5

Per il programma indicato di seguito, perché il primo printf stampa valori diversi per argv e ? Il secondo printf stampa lo stesso valore per a e &a. Qual è il meccanismo con cui vengono archiviate le variabili argomento passate al programma?Output diverso tra argv e normale array di stringhe

#include<stdio.h> 
    int main(int argc, char * argv[]){ 
    char * a[10]; 
    printf("%d %d\n\n",argv,&argv); 
    printf("%d %d",a,&a); 
    return 0; 
} 

Qual è il meccanismo di memorizzazione di questi parametri in un array di stringhe

+1

printf ("% d% d", a, &a); qui & a e a punterà allo stesso indirizzo ... quindi non è necessario stamparli entrambi e utilizzare% p anziché% d per stampare l'indirizzo. – sunny1304

+0

Penso che questo sia perché il puntatore argv è inizializzato ma il tuo puntatore non è così ha lo stesso indirizzo – Saxtheowl

risposta

5

Il problema non è circa argv è speciale, ma sulla funzione passaggio degli argomenti. Prova questo programma:

#include<stdio.h> 

void foo(int a[]) 
{ 
    int b[10]; 
    printf("foo :%p %p\n",a,&a); 
    printf("foo :%p %p\n",b,&b); 
} 

int main(int argc, char* argv[]) 
{ 
    int a[10]; 
    printf("main:%p %p\n", a, &a); 
    foo(a); 
    return 0; 
} 

L'uscita nella mia macchina:

main:0x7fffb4ded680 0x7fffb4ded680 
foo :0x7fffb4ded680 0x7fffb4ded628 
foo :0x7fffb4ded630 0x7fffb4ded630 

La prima e la terza linea non è sorprendente dal momento che per una serie arr, arr e &arr hanno lo stesso valore. La seconda linea deve essere spiegata.

Come si può vedere, quando a viene passato nella funzione foo, il valore di a non è cambiato, ma l'indirizzo &a è cambiato dal momento che le funzioni C passano sempre argomenti per valore, ci sarà una copia locale dell'argomento all'interno della funzione.

È lo stesso con argv poiché è solo un argomento nella funzione main.


EDIT: Per chi non è d'accordo con me, la mia risposta non è contro l'altra risposta. Al contrario, si completano a vicenda. argv è un puntatore esattamente perché è un array passato come argomento di funzione e "decaduto" in un puntatore. Anche in questo caso, argv non è speciale, non si comporta in modo diverso dagli altri array che vengono passati come argomento di funzione, questo è l'intero punto del mio codice di esempio.

+0

Bel codice di esempio! Penso che l'argomento "argv" in main abbia un posto speciale prima di vedere la tua risposta! –

+0

Questa non è davvero la risposta. Per ogni variabile 'a' di tipo array,' & a' e 'a' come puntatori avranno * sempre * lo stesso indirizzo. Questo è il risultato di come funzionano i tipi di array in C. La differenza è che 'argv' non è di tipo array. – newacct

+0

@newacct Allora perché 'argv' è un puntatore? Esattamente perché è passato come argomento di funzione e "decaduto" in un puntatore. –

4

La differenza tra argv e a nel tuo esempio dal punto 6.7.6.3 annuncio 7 del C-standard:

Una dichiarazione di un parametro come '' array di tipo '' sono adeguati a '' puntatore qualificato per digitare '', dove i qualificatori di tipo (se presenti) sono quelli specificati all'interno di [e] della derivazione del tipo di matrice. Se la parola chiave static appare anche all'interno di [e] della derivazione del tipo di matrice, quindi per ogni chiamata alla funzione, il valore dell'argomento effettivo corrispondente deve fornire l'accesso al primo elemento di una matrice con almeno tanti elementi come specificato dalla dimensione dell'espressione.

conseguenza argv è un puntatore che ha il suo indirizzo, che a è un array e a indica l'indirizzo del primo elemento della matrice, che è la stessa come l'indirizzo della matrice.

+0

+1 questa è la vera risposta – newacct

Problemi correlati