>我有一个问题要问链表上我不明白的代码的一部分。我正在建立一个双向链表,有一部分我被困住了,希望有人可以帮助我。我对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 不大。