我有一个问题要问关于我不理解的链表上的部分代码。 我正在建立一个双重链接列表,我有一个部分,我被困在希望有人可以帮助我。 我对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个元素)
有什么我错过的吗? 有人可以解释我的问题是什么吗?
答案 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个不大。)