我无法确定为什么这个C程序给了我这个答案

时间:2014-08-18 07:04:53

标签: c pointers const

无法知道为什么输出为6? 在给定的C程序中,我每次输出为6,所以我不能说它是打印垃圾值

#include<stdio.h>
void main()
{
    int const* a=2; 
    printf("%d\n",++(a));
}

我无法确定为什么这个C程序会给我这个答案。

5 个答案:

答案 0 :(得分:9)

当您递增指针时,它实际上会增加指向它的类型的大小。

这里初始化一个指向值2的指针。然后递增指针,通过上面的指针递增系统上的sizeof(int)4。然后打印出这个值 - 6。

答案 1 :(得分:2)

您创建int指针并将其设置为指向地址2。当你尝试打印时,你实际上做指针数学(不是递增指向int的值)。 int的大小为4个字节,因此,2 + 4 = 6。

如果您想访问指向int的值,则需要使用*

int *a = malloc(sizeof(int));
*a = 2;
printf("%d\n", ++(*a));

注意,您不能将a声明为const,因为此代码会更改它的值。 如果你想创建一个常量指针(所以你不能改变它的指针,但仍然可以改变数据),你需要在const之后放置*

int * const a = malloc(sizeof(int));

答案 2 :(得分:2)

这实际上很容易调试,看看这里发生了什么。运行这段代码并查看值:

#include<stdio.h>
int main()
{
    int const* a=2;

    printf("Size of int %d\n", sizeof(int));
    printf("Size of int const* %d\n", sizeof(int const*));
    printf("Size of a %d\n", sizeof(a));
    printf("Not incremented %d\n", a);
    printf("Incremented %d\n",++(a));

    return 0;
}

我得到了输出:

Size of int 4
Size of int const* 8
Size of a 8
Not incremented 2
Incremented 6

在64位计算机上。很明显,这表明当你执行'++(a)'时,你将增加2到int的大小。当你宣布

时,为什么会出现这种情况
int const* a=2;

嗯,这是因为你在 指针类型 的大小上加2,而不是指针的大小。改为:

long const* a = 2;

观察差异,看出情况就是这样。

这是C / C ++语言的一个怪癖。

答案 3 :(得分:1)

您的程序无法以多种方式失效。

首先,初始化具有数值(不是常数零)的指针是非法的。此

int const* a = 2; 

无效C.

其次,使用%d格式说明符打印指针值是不合法的。 %d用于整数,不用于指针。这意味着这个

printf("%d\n",++(a));

产生未定义的行为。

第三,main必须返回int,而不是void

最后,如果您的编译器实际上吞下了这段代码并且反过来吐出某种可执行文件,那么人们会期望它打印6。指针初始化将&#34;通常&#34;指出地址2。你的增量将通常&#34;通常&#34;按int的大小增加该地址。 int的大小为&#34;通常&#34; 42 + 4等于6。应用于指针的%d格式说明符将&#34;通常&#34;打印指针所指向的地址的十进制表示。

答案 4 :(得分:0)

表达式int const* a = 2;是错误的。您可以使用int const* a = (int const*)2;代替。但是有一个关于你的目标的问题。

你真的要打印指针值或a指向的值吗?

注意a指向一个不可修改的常量值。