繁体   English   中英

我的程序的输出令人困惑

[英]The outputs of my program are confusing

我有这样的代码

int main () 
 { 
     unsigned int x [4] [3] = 
     {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}, {10, 11, 12}};
     printf("%u, %u, %u", x + 3, * (x + 3), * (x + 2) + 3); 
 }

这三个值的输出都相同,谁能告诉我原因。

首先-正如其他人指出的-您需要使用正确的格式说明符,并将这些值转换为指针。


现在,为什么它们都赋予相同的价值。

这里x是一个数组。 并且其元素的类型是unsigned int[3] x是一个unsigned int[3]数组。

首先, x + 3给出数组中第四个元素的地址。 那是{10, 11, 12}的地址。 该数组在内存中的地址将是其数组中第一个元素的地址。 那是内存中的10地址。 注意,该值为int (*) [3] ,即address of an unsigned int[3] array

其次, * (x + 3)等效于x [3],它是第四个元素,它是unsigned int[3] 它是数组{10, 11, 12} 该值指向数组{10, 11, 12}的第一个元素。 也就是说,此值指向10 请注意,此值是unsigned int[3]

第三*(x+2) + 3 :这里*(x + 2)等效于x[2] ,它是一个unsigned int[3] ,它是{7, 8, 9}数组,当您执行+ 3您再次得到10的地址。 请注意,此值是unsigned int[3]

因此,在所有三种情况下,您都会看到结果是内存中的相同地址,即存储10的地址-即使您在不同的时间代表不同的事物,也是如此。 unsigned int (*)[3] unsigned int[3] ,第二和第三是unsigned int[3]

提炼的未定义行为:

printf("%u, %u, %u", x + 3, * (x + 3), * (x + 2) + 3);

所有其他参数都必须是unsigned int ,但2d也是unsigned int (*)[3] ,3d也是unsigned int * ,第4个也是unsigned int *

您得到错误的值,因为您执行了错误的指针运算。
x的类型为unsigned int[4][3] ,它是一个长度为4的数组,每个成员本身就是一个长度为3的数组。

那么x+3什么? 这是在最后一个成员的地址x (记得成员x数组 )。
因此, *(x+3)本身就是一个数组。 但是,当将数组作为函数参数传递给数组时会发生什么呢? 它们变成指针。 所以你看到数组中的第一个元素,通过在错误的类型说明符错位的地址printf

好的,让我们进入元素x[2][3] 这将是*(*(x+2)+3)这样的表达式,它总共等效于*(&x[0][0] + 2*3 + 3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM