当我在 linux 中执行此代码时,c 指针以相反的方式递增

标签 c

我写了一个像这样的简单的c程序

#include<stdio.h>
void main()
{
int a=10;
int *p;int **q;
p=&a,q=&p;
printf("size of p %d\n",sizeof(p));
printf("%d\t%d\n",p,q);
printf("%d\t%d",++p,++q);
}

输出是这样的

size of p 8
55611340        55611320
55611344        55611328

如果我再次执行相同的二进制文件,我会变成这样

size of p 8
-385904884      -385904904
-385904880      -385904896

为什么输出第二次以相反的方式变化。 O/p 每次都随机反向变化。谁能告诉我为什么会发生这种情况

最佳答案

%d 格式说明符用于打印有符号整数,而不是指针。使用不正确的格式说明符会调用 undefined behavior .

要正确打印指针,请使用 %p 格式说明符并将有问题的指针强制转换为 void *(向/从 强制转换的罕见时间之一void * 是必需的)。

printf("%p\t%p\n", (void *)p, (void *)q);
printf("%p\t%p", (void *)(++p), (void *)(++q));

此外,使用 %zu 格式说明符打印 size_t(sizeof 运算符返回)。

printf("size of p %zu\n",sizeof(p));

关于当我在 linux 中执行此代码时,c 指针以相反的方式递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35085877/

相关文章:

c - C++ 注释在 C 中被认为是糟糕的风格吗?

c++ - 关于Linux .so文件无法链接到main.cpp文件

c - OpenMPI 并行读取文本文件

c - GNU 调试器的 GUI

c - memset 清除不应该的内容

c - 读取 C 中的行

c - 将 smbus.c 链接到 smbus.h?

c - 变量值测试中的段错误

c - CUDA 中的简单缩减程序

c - 变量地址之间的差异