[英]Incrementing NULL pointer in C
如果我在C中遞增NULL
指針,那么會發生什么?
#include <stdio.h>
typedef struct
{
int x;
int y;
int z;
}st;
int main(void)
{
st *ptr = NULL;
ptr++; //Incrementing null pointer
printf("%d\n", (int)ptr);
return 0;
}
輸出:
12
是不確定的行為 ? 如果不 ,那么為什么 ?
行為始終未定義。 你永遠不能擁有NULL的內存。
指針算法僅在數組中有效,您可以設置指向數組索引的指針或指向最終元素之外的一個位置。 注意我在談論在這里設置指針,而不是取消引用它。
您還可以設置指向標量的指針和標量之前的指針。
您不能使用指針算法來遍歷您擁有的其他內存。
是的,它會導致未定義的行為 。
任何運算符都需要“有效”操作數, NULL
不是后增量運算符的值。
引用C11
, 章節§6.5.2.4
postfix
++
運算符的結果是操作數的值。 作為副作用,操作數對象的值遞增(即,將相應類型的值1添加到其中)。 [....]
並且與加法運算符有關,§6.5.6
另外,兩個操作數都應具有算術類型,或者一個操作數應是指向完整對象類型的指針,另一個操作數應具有整數類型。 (遞增相當於添加1.)
P7,
[...]指向不是數組元素的對象的指針與指向長度為1的數組的第一個元素的指針的行為相同,其中對象的類型為其元素類型。
和,P8,
如果指針操作數指向數組對象的元素,並且數組足夠大,則結果指向偏離原始元素的元素,使得結果元素和原始數組元素的下標的差異等於整數表達式。 換句話說,如果表達式
P
指向數組對象的第i
個元素,則表達式(P)+N
(等效地,N+(P)
)和(P)-N
(其中N
具有值n
)指向分別為數組對象的第i+n
和第i−n
個元素,只要它們存在。 [....]如果指針操作數和結果都指向同一個數組對象的元素,或者指向數組對象的最后一個元素,則評估不應產生溢出; 否則,行為未定義。
在您的示例中,您沒有取消引用剛剛打印出它指向的地址的指針。 當您步進指針時,它將以其引用類型的大小遞增。 你試一試:
printf("Test: %lu", sizeof(st));
你會得到Test: 12
作為輸出。 如果你取消引用它,比如*ptr
,它將導致一個未定義的行為 。
我認為ptr將指向struct st
的第二個數組成員(就好像有)。 這就是ptr++
作用。 最初指針為0或NULL
。 現在是12( 3 * sizeof(int)
= 3 * 4 = 12)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.