[英]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
當n
為10
,代碼不會在您的系統上崩潰-可能是因為malloc
在塊的末尾添加了足夠的填充以容納超出數組末尾的額外元素,但錯誤仍然存在。
您可以使用內存分析器(例如valgrind)找到此類隱藏的錯誤。
解決方法是在初始化中使用正確的索引:
for(int i = 0 ; i != MaxSize ; i++) {
}
這是關鍵:
mygraph->table[n].name = name;
沒有提及為name
變量分配內存。
另外,在表達式的右側分配name
變量,最好通過使用strncpy
或strdup
指出您的意圖來進行指示。
確保自己確實有責任,還free
name
成員占用的內存。
您的循環需要從0
到MaxSize-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.