所以我正在做指標算術作業,我需要減少和增加指標,以此作為其預期結果。這就是我所做的
#include <stdio.h>
void main(void){
int d = 10;
int c = 8;
int b = 6;
int a = 4;
int *ptr; //these lines are given
printf("decrement \n");
for (ptr = &d; ptr >= &a; ptr--)
{
printf("%d \n",*ptr);
}
printf("increment \n");
for (ptr = &a; ptr <= &d; ptr )
{
printf("%d \n",*ptr);
}
}
但結果跳過了 8 和 6:
decrement
10
4
increment
4
10
所以我決定在開始時列印地址以幫助除錯
printf("%p\n",(void*)&d);
printf("%p\n",(void*)&c);
printf("%p\n",(void*)&a);
printf("%p\n",(void*)&b);
但是運行后,它就起作用了
000000fc6a9ffb34
000000fc6a9ffb30
000000fc6a9ffb28
000000fc6a9ffb2c
decrement
10
8
6
4
increment
4
6
8
10
所以我知道邏輯是可行的,但如果不先列印就行不通,我不知道為什么
我正在使用 Vscode 和 GCC
uj5u.com熱心網友回復:
所以我知道邏輯是可行的,但如果不先列印就行不通
未定義行為(UB),任何事情都可能發生。
int d = 10;
int a = 4;
int *ptr = &d;
ptr >= &a
ptr >= &a是未定義的行為(UB)。
當不屬于同一陣列(或之后的陣列)時,C 中指標的順序比較是 UB。
ptr--也是 UB,因為它試圖在 之前形成地址d。指標數學只適用于陣列/物件(或之后的)
uj5u.com熱心網友回復:
在你的第一個例子中,你沒有使用變數 b 和 c,只是 a 和 d - 因此(我懷疑)實作正在優化它們
在第二個示例中,您使用了所有四個變數 a、b、c 和 d 的變數,因此它們不能被優化掉
uj5u.com熱心網友回復:
您的程式有四個不同的變數,而不是大小為 4 的陣列。所以變數的地址是不可預測的。
int d = 10;
int c = 8;
int b = 6;
int a = 4;
in Array 記憶體是連續分配的,因此如果您想這樣做,請使用 array。
#include<stdio.h>
int main(){
int arr[4] = {1, 2, 3, 4};
// increment
for(int i=0; i<4; i )
printf("%d\n",*(arr i));
// decrement
printf("-------------------------------\n");
for(int i=3; i>=0; i--)
printf("%d\n",*(arr i));
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335245.html
