链表数组索引 20 超过数组的末尾(包含 20 个元素)

  • 本文关键字:数组 包含 元素 索引 链表 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 个元素)

我错过了

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

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

正如 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] = '';

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