如何memcpy链表的结构成员

时间:2014-10-24 20:43:09

标签: c struct memcpy

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

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所以我可能做错了)。

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

1 个答案:

答案 0 :(得分:1)

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

expression -> expression = strdup (expr);

然后,您已为该字符串创建了永久存储空间。注意:您负责释放strdup分配的内存。