Как исправить приведение указателя к целому числу?

#c #pointers #casting

#c #указатели #Кастинг

Вопрос:

Я пишу программу, которая создает двусвязный список из массива. Пока что вот код:

 #include<stdio.h>
#include<stdlib.h>

struct Node {
    int data;
    struct Node *next;
    struct Node *previous;
}

struct Node *create_dll_from_array(int array[], int x) {
    int i;
    struct Node *newNode, *temp, *head;

    for (i=0; i<x; i  ) {
        newNode = (struct Node *)malloc(sizeof(struct Node));
        newNode->data = *(array i);
        if (i=0) {
            head = newNode;
            temp = newNode;
            newNode->next = NULL;
            newNode->previous = NULL;
        }
        else {
    ***     temp->next = (struct Node*) newNode->data;
            newNode->next = NULL;
    ***     newNode->previous = (struct Node*) temp->data;
            temp = newNode;
        }
    }
return head;
}

int main(){
    int array[5] = {11,2,7,22,4};
    struct Node* head;
    head = create_dll_from_array(array,5);
    return 0;
}
  

Итак, в строках с *** я получаю ошибку: предупреждение: приведение к указателю из целого числа разного размера
Я не знаю, действительно ли работает сама программа, просто спрашиваю об этих двух строках и почему они не работают. Спасибо!

Комментарии:

1. Вы путаете data и pointers

2. Ошибка сообщает вам, что не так — вы берете newNode->data то, что вы объявили как int , и присваиваете это next указателю temp . Вы не хотите, чтобы указатель на другой узел продолжал некоторое целочисленное значение — они не смешиваются. Вероятно, вы просто хотите установить temp->next = newNode . И аналогично для другого.

3. Вы хотите создать новый узел. Приведение целого числа как struct Node * этого не делает. Вам нужно будет выделить структуру в памяти (читать дальше malloc ) и заполнить ее данные значением.

4. В сторону: упростить код newNode = (struct Node *)malloc(sizeof(struct Node)); —> newNode = malloc(sizeof *newNode);

5. if (i=0) { вероятно, это не делает того, что вы намереваетесь.

Ответ №1:

Как исправить приведение указателя к целому числу?

Не присваивайте int указателю, и тогда необходимость в приведении отпадет.

Присвоите указатель указателю.

 // temp->next = (struct Node*) newNode->data;
temp->next = newNode;
  

Ответ №2:

Вы можете улучшить эти вещи:

  1. Всегда инициализируйте свой указатель с помощью NULL . Это защитит вас от указателя, указывающего на недопустимый адрес.
  2. Не закодируйте значение размера массива жестко. Вычислите это.
  3. В if условии вы использовали присваивание = . Измените это на проверку равенства == . Если вы этого не сделаете, ваша программа завершится сбоем.

просто спрашиваю об этих двух строках и почему они не работают

Это потому, что, temp->next указывает на ячейку памяти типа struct node . Вы не можете присвоить ему целочисленное значение (как вы делали). Я воспроизвел ваш полный код под некоторыми прокомментированными вами строками.

 #include<stdio.h>
#include<stdlib.h>
struct Node {
    int data;
    struct Node *next;
    struct Node *previous;
};

struct Node *create_dll_from_array(int array[], int x) {
    int i;
    // struct Node *newNode, *temp, *head;
    struct Node *newNode= NULL, *temp=NULL, *head=NULL;

    for (i=0; i<x; i  ) {
        newNode = (struct Node *)malloc(sizeof(struct Node));
        newNode->data = *(array i);
        // if (i=0) {   Its wrong
        if (i==0) {
            head = newNode;
            temp = newNode;
            newNode->next = NULL;
            newNode->previous = NULL;
        }
        else {
            // temp->next = (struct Node*) newNode->data; // issue
            temp->next = (struct Node*) newNode;
            newNode->next = NULL;
            // newNode->previous = (struct Node*) temp->data; //issue
            newNode->previous = (struct Node*) temp; //issue
            temp = newNode;
        }
    }
return head;
}

int main(){
    // int array[5] = {11,2,7,22,4};
    int array[] = {11,2,7,22,4};
    struct Node* head;
    // head = create_dll_from_array(array,5);
    head = create_dll_from_array(array,sizeof(array)/sizeof(*array));
    return 0;
}
  

Еще несколько оптимизаций, которые вы можете сделать, это то, что внутри вашей create_dll функции if условие выполняется только в первый раз. Вы можете переместить это в else условие и сделать ваше else условие вашим if условием