簡體   English   中英

無法訪問數組指針C的索引

[英]Cannot access index of array pointer C

我正在嘗試在C中設置一個相鄰的列表數組:

mygraph->table = (Node *)malloc(MaxSize * sizeof(Node));
check(mygraph->table, error);
int i;
for(i = 1; i <= MaxSize; i++)
{
    mygraph->table[i].name = NULL;
    mygraph->table[i].outlist = NULL;
    mygraph->table[i].outdegree = 0;
}
...

當我運行此代碼時,它可以正常工作。 但是,當我嘗試訪問表中的索引時,出現了段錯誤:

mygraph->table[n].name = name;

我檢查了n索引,它是正確的。 MaxSize是10,但是即使n = 1,我也會遇到分段錯誤。

編輯:

typedef struct linkedlist { // linked list of ints (for use in Node)
  int index;
  struct linkedlist *next;
} List;

typedef struct { // a Node of a Graph
  char *name;
  List *outlist; // adjacency list
  int outdegree; // length of outlist
  //double pagerank_score; //not needed for this exercise
} Node;

typedef struct {
  // your code goes here
  int MaxSize;      /*Maximum number of vertices that the graph can constain*/
  Node *table;     /*Adjacency lists' array*/
} Graph;

即使n = 1我也會遇到分割錯誤。

這是因為您的代碼具有未定義的行為。 它寫到數組的末尾:

for(i = 1; i <= MaxSize; i++) // should be i=0 ; i<MaxSize

n10 ,代碼不會在您的系統上崩潰-可能是因為malloc在塊的末尾添加了足夠的填充以容納超出數組末尾的額外元素,但錯誤仍然存​​在。

您可以使用內存分析器(例如valgrind)找到此類隱藏的錯誤。

解決方法是在初始化中使用正確的索引:

for(int i = 0 ; i != MaxSize ; i++) {
}

這是關鍵:

mygraph->table[n].name = name;

沒有提及為name變量分配內存。

另外,在表達式的右側分配name變量,最好通過使用strncpystrdup指出您的意圖來進行指示。

確保自己確實有責任,還free name成員占用的內存。

您的循環需要從0MaxSize-1 ,如下所示:

for(i = 0; i < MaxSize; i++)
{
    mygraph->table[i].name = NULL;
    mygraph->table[i].outlist = NULL;
    mygraph->table[i].outdegree = 0;
}

因此,第一個元素將位於mygraph->table[0] ,最后一個元素將位於
mygraph->table[MaxSize-1]

在指針算術中,第一個元素將從mygraph->table 開始 ,最后一個元素將從以下位置開始

((mygraph->table) + MaxSize-1) 

並會終止於:

((mygraph->table) + MaxSize) 

table[MaxSize]等價*((mygraph->table) + MaxSize) ,這超出了數組的邊界。

暫無
暫無

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

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