【问题标题】:Error(E0852)expression must be a pointer to a complete object type(generic linked list)错误(E0852)表达式必须是指向完整对象类型的指针(通用链表)
【发布时间】:2020-03-11 09:09:30
【问题描述】:

我正在尝试学习通用链表,但是当我将此行添加到我的代码中时

*(char*)(new_node->data + i) = *(char*)(new_data + i);

将new_data的内容复制到新分配的内存(struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));) 我收到两个错误:

1.expression 必须是指向完整对象类型的指针

2.'void *':未知大小

我也使用了intptr_t 而不是char*,但是没有用。

struct Node
{
    void* data;

    struct Node* next;
};

void push(struct Node** head_ref, void* new_data, size_t data_size)
{
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));

    new_node->data = malloc(data_size);
    new_node->next = (*head_ref);

//error
    int i;
    for (i = 0; i < data_size; i++)
        *(char*)(new_node->data + i) = *(char*)(new_data + i);

    (*head_ref) = new_node;
}


int main()
{
    struct Node* start = NULL;

    // Create and print an int linked list 
    unsigned int_size = sizeof(int);
    int arr[] = { 10, 20, 30, 40, 50 }, i;
    for (i = 4; i >= 0; i--)
        push(&start, &arr[i], int_size);
  /*  printf("Created integer linked list is"); 
        printList(start, printInt);

    // Create and print a float linked list 
    unsigned float_size = sizeof(float);
    start = NULL;
    float arr2[] = { 10.1, 20.2, 30.3, 40.4, 50.5 };
    for (i = 4; i >= 0; i--)
        push(&start, &arr2[i], float_size);
    printf("Created float linked list is"); 
        printList(start, printFloat);*/

    return 0;
}

【问题讨论】:

  • 您的问题缺少重要信息,例如某些对象的类型。请创建minimal reproducible example
  • 我们无法帮助处理不完整的代码。请提供minimal verifiable example
  • @user694733 抱歉,我添加了其余代码
  • @kaylum 抱歉,我添加了代码的其他必需部分

标签: c struct linked-list generic-list


【解决方案1】:

您不能对void* 指针进行指针算术运算。您需要在 before 增量:

for (i = 0; i < data_size; i++)
    *((char*)new_node->data + i) = *((char*)new_data + i);

但我建议您将整个循环替换为标准库函数 memcpy 或来自 string.hmemmove

memmove(new_node->data, new_data, data_size);

【讨论】:

    猜你喜欢
    • 2012-01-02
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多