你能告诉我两个程序之间的区别吗?

时间:2013-06-08 12:05:53

标签: c memory-management

查看内存分配的程序

#include<stdio.h>

main()
{
    char *p;
    printf("the address of p is = %u\n",p);
}

有什么区别

#include<stdio.h>

main()
{
    char *p;
    printf("the address of p is = %u\n",&p);
}

3 个答案:

答案 0 :(得分:1)

第一个程序打印未初始化指针p的值,解释为无符号整数。由于指针未初始化,因此打印的值是该位置中发生的任何值。 第二个程序打印指针p的地址,解释为无符号整数。虽然技术上不合法,但它适用于sizeof(char *)== sizeof(unsigned int)的大多数系统。由于变量“p”是一个自动变量,因此您将获得运行时分配给C堆栈的地址范围中的值。

编辑:从评论中澄清。 Printf根据控制字符串格式化在参数中传递给它的数据。 %u表示打印无符号整数。因此,当您传入p时,C将指针变量的值传递给printf。传入的字节数取决于该平台的sizeof(指针)。 printf通常仅在控制字符串与控制字符串中的所有%-directives匹配后作为参数传入的数据类型时“有效”。但是在sizeof(onetype)== sizeof(另一种类型)的情况下,我写的是正确的:printf会将特定参数位置中的位解释为控制字符串中相应位置中指定的类型。并且sizeof(指针)== sizeof(unsigned int),你将得到的是作为unsigned int打印出来的指针的值。

答案 1 :(得分:1)

第一个程序使用未初始化的自动变量(p)和使用与参数不匹配的printf格式说明符(unsigned int与指向对象的对象)打印由于未定义的行为导致的垃圾。 第二个打印p的地址(但在技术上也会调用未定义的行为)。

答案 2 :(得分:0)

您将指针变量分配到一个内存地址,而将变量指向另一个内存地址。

     +---+                +-------------------+
     | p | -------------> |     variable      |
     +---+                +-------------------+
 Address: 0xBBBBBBBB     Address: 0xAAAAAAAA

你可以有这样的代码:

int a = 5;
int* p = &a; // p, located at 0xBBBBBBBB will point to a, located at 0xAAAAAAAA

打印变量的地址只会返回0x(东西)。

&安培; &LT;可变&GT; =变量所在的地址,无论是变量还是指针(它都是变量)