从链表中的指针存储字符串
Storing strings from pointers in Linked lists
最近开始练习链表。我知道基本算法和概念,并想到实现 LL 来存储用户输入的一堆字符串。
但显然我一直在收到 Segmentation fault
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _node{
char *s;
struct _node *next;
}
node;
int main()
{
node *head = NULL;
int a = 0;
char ch;
char *str = malloc(10);
do
{
printf("\nDude %i:", a);
fgets(str, 10, stdin);
node *n = malloc(sizeof(node));
if(n == NULL)
{
printf("\ninsufficient memory");
return 1;
}
if(a == 0)
{
strcpy(n->s, str);
n->next = NULL;
head = n;
}
else
{
strcpy(n->s, str);
n->next = head;
head = n;
}
a++;
printf("\n continue?(y/n): ");
scanf("\n%c", &ch);
}while(ch == 'y');
for(node *temp = head; temp != NULL; temp = temp -> next)
{
printf("\n%s", temp->s);
}
return 0;
}
我明白我的 logic/code 在某个地方有缺陷,因为我正在触及我不应该触及的内存,但似乎无法指出哪里,因为这是我第一次处理链表。
当您 malloc
为 struct
设置 space 时,您只是为指向 _node
中的字符串的指针分配 space结构。在执行 strcpy
之前,您需要在存储字符串的位置分配一些内存并将指针 s
指向它。
即
n->s = malloc(sizeof(char)*100);
请记住,您还需要有一个策略来取消分配此内存。
正如其他人所暗示的,这类错误通常很容易被 looking/debugging 和 gdb
捕获。请记住,使用 -g
标志进行编译以获得有用的调试信息很有用。
你捕获 ''Segmentation fault' 的原因是因为在复制实际字符串 strcpy(n->s, str)
之前,你没有为结构 node
的 s
变量分配内存:strcpy(n->s, str)
。
因此,为 s
:
分配内存
n->s = (char *) malloc(10 * sizeof(char));
请注意,您不能将任何内容写入未分配的 space,因此您需要为每个节点中的字符串调用 malloc
。
如果字符串长度是固定的,那么你可以在struct node
的定义中指定长度来避免malloc
问题。
此外,建议始终free
不再引用的对象。
经过一些修改,以下代码可能会有所帮助:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 10
typedef struct node {
char str[LEN];
struct node *next;
} Node;
int main() {
Node *head = NULL;
int n = 0;
char c = 'y';
while (c == 'y') {
Node *node = malloc(sizeof(Node));
printf("Node #%d: ", n);
scanf(" ");
/* Store the string directly into the node. */
fgets(node->str, 10, stdin);
/* Remove the newline character. */
node->str[strcspn(node->str, "\n")] = 0;
node->next = head;
head = node;
++n;
printf("Continue? (y/N): ");
scanf("%c", &c);
};
Node *curr = head;
while (curr != NULL) {
printf("%s\n", curr->str);
Node *temp = curr;
curr = curr->next;
/* Remember to free the memory. */
free(temp);
}
return 0;
}
最近开始练习链表。我知道基本算法和概念,并想到实现 LL 来存储用户输入的一堆字符串。
但显然我一直在收到 Segmentation fault
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _node{
char *s;
struct _node *next;
}
node;
int main()
{
node *head = NULL;
int a = 0;
char ch;
char *str = malloc(10);
do
{
printf("\nDude %i:", a);
fgets(str, 10, stdin);
node *n = malloc(sizeof(node));
if(n == NULL)
{
printf("\ninsufficient memory");
return 1;
}
if(a == 0)
{
strcpy(n->s, str);
n->next = NULL;
head = n;
}
else
{
strcpy(n->s, str);
n->next = head;
head = n;
}
a++;
printf("\n continue?(y/n): ");
scanf("\n%c", &ch);
}while(ch == 'y');
for(node *temp = head; temp != NULL; temp = temp -> next)
{
printf("\n%s", temp->s);
}
return 0;
}
我明白我的 logic/code 在某个地方有缺陷,因为我正在触及我不应该触及的内存,但似乎无法指出哪里,因为这是我第一次处理链表。
当您 malloc
为 struct
设置 space 时,您只是为指向 _node
中的字符串的指针分配 space结构。在执行 strcpy
之前,您需要在存储字符串的位置分配一些内存并将指针 s
指向它。
即
n->s = malloc(sizeof(char)*100);
请记住,您还需要有一个策略来取消分配此内存。
正如其他人所暗示的,这类错误通常很容易被 looking/debugging 和 gdb
捕获。请记住,使用 -g
标志进行编译以获得有用的调试信息很有用。
你捕获 ''Segmentation fault' 的原因是因为在复制实际字符串 strcpy(n->s, str)
之前,你没有为结构 node
的 s
变量分配内存:strcpy(n->s, str)
。
因此,为 s
:
n->s = (char *) malloc(10 * sizeof(char));
请注意,您不能将任何内容写入未分配的 space,因此您需要为每个节点中的字符串调用 malloc
。
如果字符串长度是固定的,那么你可以在struct node
的定义中指定长度来避免malloc
问题。
此外,建议始终free
不再引用的对象。
经过一些修改,以下代码可能会有所帮助:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 10
typedef struct node {
char str[LEN];
struct node *next;
} Node;
int main() {
Node *head = NULL;
int n = 0;
char c = 'y';
while (c == 'y') {
Node *node = malloc(sizeof(Node));
printf("Node #%d: ", n);
scanf(" ");
/* Store the string directly into the node. */
fgets(node->str, 10, stdin);
/* Remove the newline character. */
node->str[strcspn(node->str, "\n")] = 0;
node->next = head;
head = node;
++n;
printf("Continue? (y/N): ");
scanf("%c", &c);
};
Node *curr = head;
while (curr != NULL) {
printf("%s\n", curr->str);
Node *temp = curr;
curr = curr->next;
/* Remember to free the memory. */
free(temp);
}
return 0;
}