我準確地寫下了下面的代碼,它應該產生“2036、2036、2036”,但每當我反復按下“運行”按鈕時,它都會回傳 8-9 位奇怪的隨機值。
有人知道嗎?
#include <stdio.h>
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);
}
uj5u.com熱心網友回復:
您宣告了一個二維陣列
unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
{7, 8, 9}, {10, 11, 12}};
在呼叫 pf 的引數運算式中使用printf
printf("%u, %u, %u", x 3, *(x 3), *(x 2) 3);
它被隱式轉換為指向其型別的第一個元素的指標unsigned int ( * )[3]
。
指向陣列第四行的指標也是如此x 3
,您試圖將其作為 unsigned int 輸出,從而導致未定義的行為。
該運算式*( x 3 )
產生陣列的第四行,它被隱式轉換為指向該行第一個元素的指標。因此,陣列第四行的第一個元素的地址作為 unsigned int 輸出,再次呼叫未定義的行為。
該運算式*(x 2)
給出了第三行的第一個元素,如上所述。因此,運算式*(x 2) 3
在第三行的最后一個元素之后產生記憶體地址。
只需重寫printf
like的呼叫
printf("%p, %u, %u\n", ( void * )( x 3 ), **(x 3), **(x 2) 3);
你會得到第四行的地址,第四行的第一個元素的值 (10) 和第三行的第一個元素的值 (7) 加上 3 即 10。
否則你需要寫
printf("%p, %p, %p\n", ( void * )( x 3 ), ( void * )( *(x 3) ), ( void * )( *(x 2) 3 ) );
輸出具有指標型別的原始運算式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462806.html
上一篇:何時以及為什么應該使用void作為C中函式的回傳型別?
下一篇:基于模板函式引數的指標級回傳型別