Linked List数组索引20超过了数组的末尾(包含20个元素)

时间:2013-12-22 15:25:12

标签: c

我有一个问题要问关于我不理解的链表上的部分代码。 我正在建立一个双重链接列表,我有一个部分,我被困在希望有人可以帮助我。 我对C很新,但我希望我能理解我正在犯的错误。

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个元素)

有什么我错过的吗? 有人可以解释我的问题是什么吗?

2 个答案:

答案 0 :(得分:3)

C(和许多其他语言)中的数组具有基于零的索引系统。大小为20的元素的数组具有从0到19(包括0和19)的索引。这就是它的工作原理 - 因此索引20将指向第21个元素。

答案 1 :(得分:0)

pointed out已经mathematician1975,在20个对象的数组中,可以分配的最大数组索引是19,因为数组是从零开始的,而不是从1开始的。

但是,您的整个作业可能都是错误的。您似乎想要将字符串从value复制到链接列表节点,因此您应该替换:

var->data[20] = *value;

使用:

strcpy(var->data, value);

假设您信任您的输入(在这种情况下为value),或使用有界副本,例如:

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

确保您有一个以null结尾的字符串,而不会有任何溢出缓冲区的风险。 (谨慎使用strncpy()将小字符串复制到大缓冲区中;它做了很多工作。但是大的意思是千字节或更多的数据,可能是数百个字节; 20个不大。)