gpt4 book ai didi

c - 使用 strcpy 函数时出现段错误错误

转载 作者:行者123 更新时间:2023-11-30 16:07:42 25 4
gpt4 key购买 nike

我正在实现双向链表,在函数create_head_node、insert_head、insert_tail中我必须将数组名称复制到节点。然后我使用函数 strcpy 来复制它,但出现段错误错误。我通过 cpystr 重新实现函数 strcpy 然后在 dest[i]=source[i]; 处出现段错误错误。任何人都可以向我解释为什么它是错误的以及如何解决它。感谢您的帮助。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct linked_list
{
char name[30];
float point;
struct linked_list *p_node;
struct linked_list *n_node;
}node;

node *create_head_node(node *,char *, float);
node *insert_head(node *, char*, float);
void insert_tail(node *, char*, float);
node *insert_after(node *, char*, float, int);
int count_node(node *);
void print_list(node *);
void cpystr(char*, char*);

int main(){
node *head=(node*)malloc(sizeof(node));
head=create_head_node(head, "asd fgh", 10);
head=insert_head(head, "abc def", 9.8);
insert_tail(head, "qwe rty", 8.98);
head=insert_after(head, "ui op", 8.7568, 1);
print_list(head);
free(head);
return 0;
}
node *create_head_node(node *head, char name[30], float point){
cpystr(head->name, name);
head->point=point;
head->p_node=NULL;
head->n_node=NULL;
return head;
}
node *insert_head(node *head, char name[30], float point){
node *temp=(node*)malloc(sizeof(node));
cpystr(temp->name, name);
temp->point=point;
temp->p_node=NULL;
temp->n_node=head;
head->p_node=temp;
head=temp;
return head;
}
void insert_tail(node *head, char name[30], float point){
node *p=head;
node *temp=(node*)malloc(sizeof(node));
cpystr(temp->name, name);
temp->point=point;
temp->n_node=NULL;
while (p!=NULL)
{
p=p->n_node;
}
p->n_node=temp;
temp->p_node=p;
}
node *insert_after(node *head, char name[30], float point, int index){
int count=count_node(head);
while (index>count)
{
printf("choose %d positions to add. choose again: ", count); scanf("%d", index);
}
if(index==0) head=insert_head(head, name, point);
else if(index==count) insert_tail(head, name, point);
else{
node *p=head;
for (int i = 0; i < index-1; i++)
{
p=p->n_node;
}
node *temp=(node*)malloc(sizeof(node));
temp->n_node=p->n_node;
p->n_node->p_node=temp;
p->n_node=temp;
temp->p_node=p;
}
return head;
}
int count_node(node *head){
node *p=head;
int count=0;
while (p!=NULL)
{
count++;
p=p->n_node;
}
free(p);
return count;
}
void print_list(node *head){
node *p=head;
while (p!=NULL)
{
printf("%s%10f", p->name, p->point);
p=p->n_node;
}
}
void cpystr(char* dest, char* source){
int i=0;
while (source[i]!='\0')
{
dest[i]=source[i];
i++;
}
*dest='\0';
}

最佳答案

让我们考虑一下指针的一般工作原理。指针是其值包含另一个变量的地址的变量。因此,在使用指针之前,必须初始化指针,即“它应指向的变量的分配地址”。现在,当您执行node* head时。 head还没有初始化,你必须为head分配内存并将其地址与head关联起来,如下所示:

    node *head = (node*)malloc( sizeof(node) );

现在您可以像这样访问 head 的成员:

     head->point = 0.01;

类似地,strcpy 将像这样工作:

     const char *dummy = "Sample";
strcpy(head->name , dummy);

请注意,strcpy 不会检查目标的大小。因此,如果目标指针不够大,无法接收“副本”,则可能会发生未定义的行为,并且经常但并不总是导致段错误。

关于c - 使用 strcpy 函数时出现段错误错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59550205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com