我正在尝试在队列末尾插入节点并面临错误。这是编译代码时的一个简单的基本错误,但却让我的生活变得艰难。
#include<stdio.h>
#include<stdlib.h>
typedef struct UNIX {
char str[20];
struct UNIX *next;
}examp;
examp *head=NULL;
int insert_last(char *s)
{
examp *new,*slide;
slide=head;
new = (examp *)malloc(sizeof(examp));
if(!new)
return(EXIT_FAILURE);
while(slide->next!=NULL)
slide=slide->next;
slide->next=new;
new->str=s;
new->next=NULL;
if(head==NULL)
{ head=new;
return 1;
}
return 1;
}
void display (void);
int main()
{
insert_last("hello ");
insert_last("how ");
insert_last("have ");
insert_last("you ");
insert_last("been ");
insert_last("! ");
display();
}
void display(void)
{
examp *slide;
slide=head;
while(slide->next!=NULL)
{ printf("%s ",slide->str);
slide=slide->next;
}
}
错误:stack_queue.c:27:10:错误:赋值给具有数组类型的表达式 新建 - &GT; STR = S;
更新:使用strncpy解决了错误,但代码未按预期工作并意外停止。
答案 0 :(得分:2)
您不能像这样分配静态数组。请考虑使用strcpy
或strncpy
来复制字符串的内容。
答案 1 :(得分:2)
您无法将字符串分配给数组!数组有自己的内存,可以在数组中写入或读取元素,但不能分配地址。
您最终可以将字符串s
内容复制到数组中:
strncpy(new->str, s, 19);
new->str[19] = '\0'; //Close the string in case of overflow.
我们使用strncpy
将复制的字符限制为数组大小(19个字符+结尾'\0'
)。
答案 2 :(得分:0)
你可以尝试一下。只有new->str=s;
替换为strcpy(new->str, s);
(即。s
将被复制到new->str
)
#include<stdio.h>
#include<stdlib.h>
typedef struct UNIX {
char str[20];
struct UNIX *next;
}examp;
examp *head=NULL;
int insert_last(char *s)
{
examp *new,*slide;
slide=head;
new = (examp *)malloc(sizeof(examp));
if(!new)
return(EXIT_FAILURE);
while(slide->next!=NULL)
slide=slide->next;
slide->next=new;
strcpy(new->str, s);
new->next=NULL;
if(head==NULL)
{ head=new;
return 1;
}
return 1;
}
void display (void);
int main()
{
insert_last("hello ");
insert_last("how ");
insert_last("have ");
insert_last("you ");
insert_last("been ");
insert_last("! ");
display();
}
void display(void)
{
examp *slide;
slide=head;
while(slide->next!=NULL)
{ printf("%s ",slide->str);
slide=slide->next;
}
}
答案 3 :(得分:0)
如前所述,您必须使用strcpy(或strncpy)来分配字符串。
除此之外,我想提两件事:
不要忘记释放malloc分配的内存。创建一个释放单个节点的方法(例子),然后你也可以提供一种方法来销毁整个列表。
我建议重命名变量new以避免混淆(纯C编译器可能会处理它,但C / C ++编译器很可能会遇到麻烦)。
考虑您的更新: 看一下以下一行
while(slide->next!=NULL)
此时幻灯片甚至不存在(它为NULL),仍然对指针执行操作。这就是程序崩溃的原因。
答案 4 :(得分:0)
您的错误出现在第一个电话insert_last("hello ")
:
int insert_last(char *s)
{
examp *new,*slide;
slide=head;
new = (examp *)malloc(sizeof(examp));
if(!new)
return(EXIT_FAILURE);
while(slide->next!=NULL)
slide=slide->next;
当你第一次调用它时,head为NULL,因此slide变为NULL,但是你没有检查它,并在
中调用它while(slide->next!=NULL)
对于第一个函数调用,幻灯片为空