----------
#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("%sn",head->val);
head = head->next;
}
}
这就是我编译的实现链表的内容。现在,由于某种原因,错误定位会产生分段错误。
可以肯定的是,我用字符 [] 替换了 char *,代码运行良好。malloc 故障是由于这个还是我似乎找不到一些微不足道的错误?
您没有在主中分配 val
char *val;
...
scanf("%s",val);
但是这里没有分配val
,当你做 scanf 时,它会去 sigsegv
您没有分配变量 val
指向的内存以及要读取字符串的位置。
char *val;
//...
do {
scanf("%s",val);
add_to_list(&head, val);
}
变量 val 未初始化,因此程序具有未定义的行为。
并且函数add_to_list
无效。例如,sizeof(val)
始终具有相同的值,该值等于指向字符的指针的大小。它不会产生此指针指向的字符串的大小。代替运算符sizeof
您应使用功能strlen
该函数可以写成
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;
}
temp->val = malloc(sizeof(val));
将sizeof(val)
更改为strlen(val)+1
。