C语言中基于字符串的链表产生分段错误 ---------- #包括 #包括 #包括 结构节点{ char*val; 结构节点*下一步; }; void将_添加到_列表(结构节点**,字符*); 无效列表所有元素(结构节点*); int main(int argc,字符**argv) { char*val; 结构节点*head=NULL; 做{ scanf(“%s”,val); 将\添加到\列表中(&head,val); } 而(val[0]!='\\'); 列出所有元素(标题); } void add_to_list(结构节点**头,字符*val) { //这会产生一个分段故障 结构节点*temp=malloc(sizeof*temp); //编辑-根据注释进行修复 temp->val=malloc(strlen(val)+1); strcpy(温度->值,值); temp->next=NULL; if(head!=NULL) 温度->下一步=*头部; *压头=温度; } 无效列表所有元素(结构节点*头) { while(head!=NULL){ printf(“%s\n”,head->val); 头部=头部->下一步; } }
这就是我编译来实现链表的内容。现在,由于某种原因,malloc’ing产生了一个分段错误 当然,我用char[]替换了char*,代码运行得很好。malloc故障是由此引起的还是有一些我似乎找不到的小错误C语言中基于字符串的链表产生分段错误 ---------- #包括 #包括 #包括 结构节点{ char*val; 结构节点*下一步; }; void将_添加到_列表(结构节点**,字符*); 无效列表所有元素(结构节点*); int main(int argc,字符**argv) { char*val; 结构节点*head=NULL; 做{ scanf(“%s”,val); 将\添加到\列表中(&head,val); } 而(val[0]!='\\'); 列出所有元素(标题); } void add_to_list(结构节点**头,字符*val) { //这会产生一个分段故障 结构节点*temp=malloc(sizeof*temp); //编辑-根据注释进行修复 temp->val=malloc(strlen(val)+1); strcpy(温度->值,值); temp->next=NULL; if(head!=NULL) 温度->下一步=*头部; *压头=温度; } 无效列表所有元素(结构节点*头) { while(head!=NULL){ printf(“%s\n”,head->val); 头部=头部->下一步; } },c,string,pointers,linked-list,C,String,Pointers,Linked List,这就是我编译来实现链表的内容。现在,由于某种原因,malloc’ing产生了一个分段错误 当然,我用char[]替换了char*,代码运行得很好。malloc故障是由此引起的还是有一些我似乎找不到的小错误 ---------- #include <stdio.h> #include <stdlib.h> #include <string.h> struct node { char *val; struct node *next; }; vo
----------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
char *val;
struct node *next;
};
void add_to_list(struct node **, char *);
void list_all_elements(struct node *);
int main (int argc, char **argv)
{
char *val;
struct node *head = NULL;
do {
scanf("%s",val);
add_to_list(&head, val);
}
while(val[0] != '\\');
list_all_elements(head);
}
void add_to_list(struct node **head, char *val)
{
//This produces a segfault
struct node *temp = malloc(sizeof *temp);
//EDIT - Fixed as per comments
temp->val = malloc(strlen(val) + 1);
strcpy(temp->val, val);
temp->next = NULL;
if(head!=NULL)
temp->next = *head;
*head = temp;
}
void list_all_elements(struct node *head)
{
while(head!=NULL) {
printf("%s\n",head->val);
head = head->next;
}
}
将sizeof(val)
更改为strlen(val)+1
将
sizeof(val)
更改为strlen(val)+1
您没有分配变量val
指向的内存以及要读取字符串的位置
temp->val = malloc(sizeof(val));
变量val未初始化,因此程序具有未定义的行为
并且函数将\u添加到\u列表
无效。例如,sizeof(val)
的值始终与指向char的指针的大小相同。它不会产生该指针指向的字符串大小。您应使用函数strlen
这个函数可以写成
char *val;
//...
do {
scanf("%s",val);
add_to_list(&head, val);
}
您没有分配变量
val
指向的内存,也没有分配读取字符串的位置
temp->val = malloc(sizeof(val));
变量val未初始化,因此程序具有未定义的行为
并且函数将\u添加到\u列表
无效。例如,sizeof(val)
的值始终与指向char的指针的大小相同。它不会产生该指针指向的字符串大小。您应使用函数strlen
这个函数可以写成
char *val;
//...
do {
scanf("%s",val);
add_to_list(&head, val);
}
您没有在主目录中分配val
void add_to_list( struct node **head, const char *val )
{
struct node *temp = malloc( sizeof *temp );
size_t n = strlen( val );
temp->val = malloc( n + 1 );
strcpy( temp->val, val );
temp->next = *head;
*head = temp;
}
但此处未分配
val
,当您执行此操作时,scanf将转到sigsegv您未在主屏幕中分配val
void add_to_list( struct node **head, const char *val )
{
struct node *temp = malloc( sizeof *temp );
size_t n = strlen( val );
temp->val = malloc( n + 1 );
strcpy( temp->val, val );
temp->next = *head;
*head = temp;
}
但是这里没有分配
val
,当您这样做时,scanf将转到sigsegvstrlen()+1,否则您将没有空间写入\0@user3576305:将sizeof*temp
更改为sizeof结构节点
。您正在取消对未初始化指针的引用。@凯文:不,这是使用sizeof操作的合法方式。没有问题。strlen()+1,否则您将没有空间写入\0@user3576305:将sizeof*temp
更改为sizeof结构节点
。您正在取消对未初始化指针的引用。@凯文:不,这是使用sizeof操作的合法方式。这没什么错。head不会为null,您应该选中*head,但这不会改变任何东西,这意味着每次分配temp->next=*head;这是正确的做法,您根本不需要if(以及temp->next=NULL)1char*val代码>-->char val[最大字符串大小]
head不会为null,您应该选中*head,但这不会改变任何东西,这意味着每次分配temp->next=*head;这是正确的做法,您根本不需要if(以及temp->next=NULL)1char*val代码>-->char val[最大字符串大小]代码>这个!非常感谢。我太天真了!但是scanf不应该在那里抛出错误吗?@user3576305程序有未定义的行为,因此无法预测将发生什么。@user3576305也不要忘记释放所有分配的内存。是的。我只是在这里展示相关的代码。这个!非常感谢。我太天真了!但是scanf不应该在那里抛出错误吗?@user3576305程序有未定义的行为,因此无法预测将发生什么。@user3576305也不要忘记释放所有分配的内存。是的。我只是在这里显示相关代码。是的!就是这样。谢谢,是的!就是这样。非常感谢。