gpt4 book ai didi

c - 如何 memcpy 结构链接列表的成员

转载 作者:行者123 更新时间:2023-11-30 15:28:31 26 4
gpt4 key购买 nike

我正在编写一个小程序,它从文本文件中获取一组数学表达式(x^2、sin x 等)并将它们绘制到图表上,当读取每个表达式时,它们被存储到声明的结构中如下:

typedef struct Expression
{
int r, g, b;
char* expression;
} Expression;

注意:r、g、b 变量是将要绘制的线条的颜色,表达式存储为字符串。

我的链表和节点声明为:

typedef struct LinkedListNode
{
struct Expression *expression;
struct LinkedListNode *next;
} LinkedListNode;

typedef struct LinkedList
{
LinkedListNode *head;
} LinkedList;

为了读取其中的表达式,我所做的就是运行一个 while 循环,直到 EOF(我知道这一切都很好):

Expression* expression = (Expression*)malloc(sizeof(Expression));
LinkedList* expressionList;
expressionList = createEmptyList();

while(!feof(readFile))
{
fscanf(readFile, "%d %d %d %[^\n]s", &r, &g, &b, expr);
fgetc(readFile);

expression -> r = r;
expression -> g = g;
expression -> b = b;
expression -> expression = expr;

insertNodeFront(expressionList, expression);
}

现在,insertNodeFront 函数是我遇到问题的地方:

void insertNodeFront(LinkedList *inList, Expression *inExpression)
{
LinkedListNode *newNode;

newNode = (LinkedListNode*)malloc(sizeof(LinkedListNode));
newNode -> expression = inExpression;
newNode -> next = inList -> head;
inList -> head = newNode;
}

我认为问题出在这一行:

newNode -> expression = inExpression;

因为每个链表的每个表达式成员仍然指向原始的表达式结构,所以它们最终都会得到相同的值(显然有问题),所以我假设我必须在其中创建 inExpression 指针的副本insertNodeFront 但我不太确定如何做到这一点,我所有使用 memcpy 的尝试都导致了崩溃(尽管这是我第一次使用 memcpy 所以我可能做错了什么)。

任何建议都会有帮助,谢谢

最佳答案

您不能分配 newNode -> expression = inExpression;,因为指针 inExpression 未保留在程序中。您需要为 newNode -> expression 分配存储空间,并将字符串的副本保存在 inExpression 中。执行此操作的简单方法是包含 string.h,然后在调用 insertNodeFront 之前使用 strdup:

expression -> expression = strdup (expr);

然后您就为该字符串创建了永久存储。注意:您有责任释放 strdup 分配的内存。

关于c - 如何 memcpy 结构链接列表的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26555963/

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