首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >%u格式规范(C)

%u格式规范(C)
EN

Stack Overflow用户
提问于 2016-02-05 10:46:40
回答 3查看 1.8K关注 0票数 0

我编译了这段代码,它给出了3次'&x‘的值。也就是说,如果x= 2000,它打印了三次2036次。假设一个整数需要4个字节的内存,我想知道这种行为的原因。

代码语言:javascript
复制
#include <stdio.h>
int main(void) {
    // your code goes here
    int x[4][3] = {0};
    printf("%u %u %u", x+3, *(x+3), *(x+2)+3);
    return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-05 11:11:15

X是指向指针数组的指针。指针数组有4个元素。这四个元素中的每一个都指向3个整数。

因此,如果x= 2000,

X=2000年,x1 =2012年,x2 =2024年,x3 =2036年。

因此,

X+3= 2036 (因为x是一个数组指针,每次增加12 )。

*(x+3) = x3 = 2036。

*(x+2)+3 = x2 +3= 2024 + 3*4 = 2036。

因此,输出将是三个相同的数字。

票数 1
EN

Stack Overflow用户

发布于 2016-02-05 10:49:23

这段代码的输出是什么?

任何事情都可能发生,因为代码通过使用unsigned的转换说明符打印指针值来引发未定义的行为。

若要打印指针值,请使用转换说明符p

数组的地址与其第一个元素的地址相同。然而,指向它们的指针是不同类型的。

xx + 3都是int (*)[3]类型,即指向一个由三个int组成的数组,假设int为size 4,三个ints的数组为12大小。

x (指向int (*)[3]的指针)增加三个元素,最终得到x指向的地址3 * 12字节。这被称为指针算法。

票数 3
EN

Stack Overflow用户

发布于 2016-02-05 10:53:52

因此,您误用了格式说明符并调用了未定义的行为。在这一点上,所发生的事情是武断和无趣的。

如果要打印指针,请使用%p说明符。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35222163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档