簡體   English   中英

指針符號的C解釋?

[英]C explanation for pointer notation?

我在網上找到了一段代碼,作為調試工作的一部分,該代碼故意在代碼中存在錯誤。 我已經解決了簡單的錯誤,但是我不確定其中是否有效的一行。

#include <stdlib.h>
#include <stdio.h>

struct foo {
    int size;
    int *array;
};

typedef struct foo bar;

bar* readArray(){
    bar *fbar = (bar *)malloc(sizeof(bar));
    fbar->array = (int *)malloc(sizeof(int)*2); //ADDED THIS LINE FOR TESTING
    int i = 0;
    int temp;
    while(scanf("%d", &temp) == 1){
        *(fbar->array + (i-1)) = temp; //THIS LINE HERE
        i++;
    }
    if(i == 0){
        printf("No numbers were entered!");
    }
    fbar->size = i;
    return fbar;

}

int main(){
    bar *p = readArray();
    return 0;
}

我嘗試運行它當然會導致段錯誤,因為該示例並未為* array分配空間。 我嘗試通過為2個int分配空間來測試該行,以測試前兩個循環是否有效。 我以為程序在讀取前2個int之后會出現段錯誤,這不會發生(程序繼續運行)。 現在,我不明白該行代碼的功能以及為什么我不進行段隔離。

我無法確切地弄清楚什么是錯誤,或者除了int * array缺少malloc()之外是否還有錯誤。

對於任何指針(或數組) p和索引i ,表達式*(p + i)完全等於p[i]

現在,如果我們使用表達式*(fbar->array + (i-1)) ,則上述fbar->array[i - 1]等於fbar->array[i - 1]

問題應該很清楚,當i == 0並且您有fbar->array[-1]時會發生什么。 它超出范圍,將導致不確定的行為

至於為什么它不會崩潰,那是未定義行為的一部分。 它可能會崩潰,它似乎可以工作(就像對您一樣),或者它會帶來鼻惡魔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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