簡體   English   中英

在C中遞增NULL指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM