2013-12-22 86 views
1

我有一個問題,需要了解鏈接列表上的一部分代碼,我不明白。 我正在建立一個雙向鏈表,並且有一部分我卡住了,希望有人能幫助我。 雖然我對C很陌生,但我希望能理解我所犯的錯誤。鏈接列表數組索引20已超過數組的末尾(其中包含20個元素)

struct node 
{ 
    struct node *previous; // Points to the previous node 
    char data[20]; 
    struct node *next; // Points out to the next node 
}*head, *last; 

void insert_beginning(char value[20]) 
{ 
    struct node *var, *temp; 
    var=(struct node *)malloc(sizeof(struct node)); 
    var->data[20]=*value; // Here's my problem 

    if (head==NULL) 
    { 
     head=var; 
     head->previous=NULL; 
     head->next=NULL; 
     last=head; 
    } 
    else 
    { 
     temp=var; 
     temp->previous=NULL; 
     temp->next=head; 
     head->previous=temp; 
     head=temp; 
    } 
} 
上線

,它說:

var->data[20]=*value; 

我有一個紙條,上面寫着:數組索引20是過去的數組的末尾(其中包含20種元素)

有我錯過了什麼? 有人可以解釋我是什麼問題嗎?

回答

3

C(和許多其他語言)中的數組具有基於零的索引系統。大小爲20的元素數組的索引範圍爲0到19(含)。這就是它的工作原理 - 因此索引20將指向第21個元素。

0

已經是pointed outmathematician1975,在一個包含20個對象的數組中,可以分配的最大數組索引是19,因爲數組是基於零的,而不是基於一個的。

但是,您的整個任務可能是錯誤的。它看起來像你想的字符串從value複製到鏈表節點,所以你可能要更換:

var->data[20] = *value; 

有:

​​

假設你在這種情況下,相信你的輸入(value )或使用有限副本,例如:

strncpy(var->data, value, sizeof(var->data)-1); 
var->data[sizeof(var->data)-1] = '\0'; 

確保您有一個以null結尾的字符串,並且沒有任何溢出的風險 緩衝。 (謹慎使用strncpy()將小字符串複製到大緩衝區中;它做了很多工作,但大意味着千字節或更多的數據,可能是數百字節; 20不是很大)

+0

謝謝大家幫助我 – user3117119

相關問題