2011-12-22 7 views
7

So che le mie domande sono molto semplici ma googleing non mi ha dato nessun risultato utile ... Probabilmente sono troppo semplici !!Stampare gli indirizzi del puntatore in C [due domande]

No. 1

char* createStr(){ 
    char* str1 = malloc(10 * sizeof(char)); 
    printf("str1 address in memory : %p\n", &str1); 
    return str1; 
} 

int main(void){ 
    char* str2 = createStr(); 
    printf("str2 address in memory : %p\n", &str2); 
} 

Risultato:

str1 address in memory : 0x7fffed611fc8 
str2 address in memory : 0x7fffed611fe8 

Perché sono gli indirizzi diversi dentro e fuori della funzione createStr() e come posso gratuito (str1) ???

No. 2

int main(int argc, int *argv[]){ 
    printf("Basename is %s ", (char*) argv[0]); 
    if(argc > 1){ 
     printf("and integer arg is : %d.\n", (int) *argv[1]); 
    } 
} 

Se compilo e corro $ ./test 3, come posso ottenere int 3?

Risultato:

Basename is ./test and integer arg is : 1380909107. 
+11

Una domanda per domanda, per favore –

risposta

6

Commenti in linea!

No. 1

#include <stdio.h> 
#include <stdlib.h> 

char* createStr(){ 
    char* str1 = malloc(10 * sizeof(char)); 
    /* str1 is a local variable which is allocated in 
     stack and not in heap */ 
    /* But the dynamic memory allocation is done in 
     heap so malloc returns a portion of memory from 
     heap and str1 is made to point to that! 
    */ 
    /* 
    aaaa (stack) bbbb (heap) 
    +--------+  +-+-+-------+-+ 
    | str1 |----->|0|1| ..... |9| 
    +--------+  +-+-+-------+-+ 
    */ 

    printf("address of str1 in memory : %p\n", &str1); 
    /* prints aaaa and not bbbb */ 
    /* to print the base address of the allocated memory, 
    printf("str1 address in memory : %p\n", str1); 
    */ 
    printf("address of the allocated memory inside func : %p\n", str1); 

    return str1; 
} 

int main(void){ 
    char* str2 = createStr(); 
    /* str2 is a local variable to main and so it is 
     allocated in the stack 
    */ 
    /* 
    cccc (stack) bbbb (heap) 
    +--------+  +-+-+-------+-+ 
    | str2 |----->|0|1| ..... |9| 
    +--------+  +-+-+-------+-+ 
    */ 
    printf("address of str2 in memory : %p\n", &str2); 
    /* the above will print the address of the str2 
     (which is cccc) but not where it is pointing 
     to (bbbb) .. 
    */ 
    /* So to print the base address of where it is 
     pointing to (bbbb), 
    printf("str2 address in memory : %p\n", str2); 
    */ 
    printf("address of the allocated memory inside main : %p\n", str2); 
} 

No 2.

#include <stdio.h> 

int atoi(char a[]) 
{ 
     int i, n=0; 

     for (i=0 ; a[i] >= '0' && a[i] <= '9' ; i++) 
       n = 10 *n + (a[i]-'0'); 

     return n; 
} 

int main(int argc, char *argv[]){ 
    printf("Basename is %s ", (char*) argv[0]); 
    if(argc > 1){ 
     printf("and integer arg is : %d.\n", atoi(argv[1])); 
    } 
} 


$ gcc atoi.c -o atoi 
$ ./atoi 3 
Basename is ./atoi and integer arg is : 3. 
$ 

punto da notare:

  • WRT # 2: in main() dovrebbe essere char * argv[] e non int * argv[]
+0

Whow !!! Grazie per il tuo tempo;) – Psyclops

+0

@Psyclops: se questo risponde alla domanda, contrassegnala così. Fare clic sul segno di spunta, per così dire. – ArjunShankar

5

Per fissare la prima:

char* createStr(){ 
    char* str1 = malloc(10 * sizeof(char)); 
    printf("str1 address in memory : %p\n", str1); 
    return str1; 
} 

int main(void){ 
    char* str2 = createStr(); 
    printf("str2 address in memory : %p\n", str2); 
    free(str2); 
} 

In caso contrario, si stampa l'indirizzo del variabili (str1 e str2), non il indirizzo a cui punta la variabile.

Ho anche aggiunto una chiamata allo free() per riparare la perdita di memoria.

Per quanto riguarda il secondo, è necessario utilizzare atoi() per convertire la stringa in un int:

printf("and integer arg is : %d.\n", atoi(argv[1])); 
+0

Grazie a aix! Bella spiegazione :) – Psyclops

0

Il primo esempio assegna la stringa, quindi restituisce un puntatore ad esso. Quando si esegue l'assegnazione dal valore di ritorno del metodo, è sufficiente assegnare il puntatore. Hai sempre fatto solo una corda.

Nel secondo esempio, si desidera atoi.

3

Domanda 1:

Gli indirizzi sono diversi perché si sta prendendo gli indirizzi dei puntatori, non gli indirizzi delle variabili tenuti dai puntatori. Poiché str2 esiste nella pila di main e str1 nella pila di createStr, i loro indirizzi sono diversi.

È possibile liberare str1 liberando str2, perché indicano la stessa posizione. L'indirizzo a cui fa riferimento str1 viene copiato all'interno di str2 quando str1 viene restituito da createStr.

Domanda 2:

Usa int value = atoi(argv[1]); Questo trasforma un char* a un int.

+0

Ciao Tudor, grazie mille! – Psyclops

0

Per la seconda exemple: *argv[1] è una char * (cioè "3")
Se si desidera visualizzare "3" è necessario utilizzare printf("%s\n", *argv[1]); o ottenere un numero intero da stringa utilizzando atoi().
Forse puoi anche provare a scrivere la tua versione di atoi()!

Problemi correlati