2011-12-22 19 views
7

Sé que mis preguntas son muy simples, pero buscarlas en google no me dieron ningún resultado útil ... ¡Probablemente sean demasiado simples!Imprimir direcciones de puntero en C [dos preguntas]

Nº 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); 
} 

Resultado:

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

¿Por qué son diferentes las direcciones de entrada y salida de la función createStr() y cómo puedo libre (cadena1) ???

Nº 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]); 
    } 
} 

Si compilar y ejecutar $ ./test 3, ¿cómo puedo obtener int 3?

Resultado:

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

Una pregunta por pregunta, por favor –

Respuesta

6

Comentarios en línea!

Nº 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 a tener en cuenta:

  • WRT # 2: en main() debe ser char * argv[] y no int * argv[]
+0

Whow !!! Gracias por su tiempo;) – Psyclops

+0

@Psyclops: Si esto responde a la pregunta, márquelo. Haga clic en "marcar", por así decirlo. – ArjunShankar

5

para fijar la primera de ellas:

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); 
} 

De lo contrario, se están imprimiendo a cabo la dirección de la variable de (str1 y str2), no el dirección a la que apunta la variable.

También he agregado una llamada al free() para arreglar la pérdida de memoria.

En cuanto a la segunda, es necesario utilizar atoi() para convertir la cadena en un int:

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

Gracias aix! Buena explicación. :) – Psyclops

0

El primer ejemplo asigna la cadena, y devuelve un puntero a ella. Cuando realiza la asignación desde el valor de retorno del método, solo asigne el puntero. Solo has hecho una cadena.

En el segundo ejemplo, quiere atoi.

3

Pregunta 1:

Las direcciones son diferentes porque está tomando las direcciones de los punteros, no las direcciones de las variables en poder de los punteros. Como str2 existe en la pila de main y str1 en la pila de createStr, sus direcciones son diferentes.

Puede liberar str1 liberando str2, ya que apuntan a la misma ubicación. La dirección a la que apunta str1 se copia dentro de str2 cuando se devuelve str1 desde createStr.

Pregunta 2:

Uso int value = atoi(argv[1]); Esto convierte una char* a un int.

+0

¡Salud, Tudor, muchas gracias! – Psyclops

0

Para el segundo exemple: *argv[1] es una char * (es decir "3")
Si desea mostrar "3" usted tiene que utilizar printf("%s\n", *argv[1]); o conseguir un número entero de la cadena mediante atoi().
¡Quizás incluso puedas intentar escribir tu propia versión de atoi()!