在C中打印指针地址[两个问题]

时间:2011-12-22 12:01:15

标签: c pointers int free command-line-arguments

我知道我的问题很简单,但谷歌他们并没有给我任何有用的结果......他们可能太简单了!

没有。 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);
}

结果:

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

为什么地址不同于createStr()函数以及如何释放(str1)?

没有。 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]);
    }
}

如果我编译并运行$ ./test 3,我怎么能得到int 3?

结果:

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

5 个答案:

答案 0 :(得分:8)

评论内联!

没有。 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);
}

否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.
$

注意事项:

  • w.r.t#2:在main()中应该是char * argv[]而不是int * argv[]

答案 1 :(得分:5)

修复第一个:

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

否则,您打印出变量str1str2)的地址,而不是变量指向的地址。

我还添加了对free()的调用来修复内存泄漏。

关于第二个,您需要使用atoi()将字符串转换为int

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

答案 2 :(得分:3)

问题1

地址不同,因为您要获取指针的地址,而不是指针所拥有的变量的地址。由于str2堆栈上的mainstr1堆栈上存在createStr,因此它们的地址不同。

您可以释放str1释放str2,因为它们指向同一位置。从str1返回str2时,str1指向的地址会在createStr内复制。

问题2

使用int value = atoi(argv[1]);这会将char*转换为int

答案 3 :(得分:0)

第一个示例分配字符串,然后返回指向它的指针。从方法的返回值进行赋值时,只需指定指针即可。你只做了一个字符串。

在第二个示例中,您需要atoi

答案 4 :(得分:0)

对于第二个例子:*argv[1]char *(即"3"
如果您要显示"3",则必须使用printf("%s\n", *argv[1]);或使用atoi()从字符串中获取整数。
也许你甚至可以尝试编写自己的atoi()版本!