【问题标题】:How do I memcpy struct members of a linked list我如何 memcpy 链表的结构成员
【发布时间】:2014-10-24 20:43:08
【问题描述】:

我正在编写一个小程序,它从文本文件中获取一组数学表达式(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;

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

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

【问题讨论】:

  • 我没有遇到任何问题,我还应该用什么来代替?而(fgetc(f)!= EOF)?
  • @user2978566 “我没有遇到任何问题” - 那是因为你从来没有检查看看你的fscanffgetc是否成功,然后根据他们所做的假设继续前进。评论中提供的link 解释了为什么它几乎总是错误的。

标签: c struct memcpy


【解决方案1】:

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

expression -> expression = strdup (expr);

您已经为字符串创建了永久存储。注意:你负责释放strdup分配的内存。

【讨论】:

  • 在这种情况下,我一直想知道实现引用计数的字符串结构是否值得付出努力。但我想最终“这取决于”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 2013-10-07
  • 2015-12-20
  • 2021-11-05
  • 1970-01-01
  • 2021-08-18
  • 2013-07-18
相关资源
最近更新 更多