Выражение ошибки (E0852) должно быть указателем на полный тип объекта (общий список c) - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь узнать обобщенный c связанный список, но когда я добавил эту строку в свой код

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

, чтобы скопировать содержимое new_data во вновь выделенную память (struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));) Я получил две ошибки:

1. Выражение должно быть указателем на полный тип объекта

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;
}

1 Ответ

0 голосов
/ 11 марта 2020

Вы не можете сделать арифметику указателей c на void* указателях. Вам нужно привести до приращения :

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

Но я бы порекомендовал заменить весь l oop стандартными библиотечными функциями memcpy или memmove с string.h.

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