ошибка: разыменование указателя на неполный тип ‘Массив структуры»

#c #struct #declaration #definition #incomplete-type

Вопрос:

Я пытаюсь ввести значение в структуру, которая есть у меня в заголовочном файле. Значение задается в основном файле и передается в качестве аргумента функции. Но я получаю сообщение об ошибке, в котором говорится error: dereferencing pointer to incomplete type ‘struct Array’ array->size = size; Компилятор говорит о стрелке в строке array->size = size; , которую я предоставил в своих файлах ниже.

Заголовок.h:

 #include <stdio.h>
//Include libraries used

struct Array {
  unsigned int size;
  unsigned int cap;
  int data;
};
//Declare struct Array

struct Array *newArray(unsigned int size, unsigned int cap);
 

функция.c:

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

struct Array *newArray(unsigned int size, unsigned int capacity ) {

  struct Array *array;

  array->size = size;

}
 

Мой основной файл.c содержит файл заголовка, поэтому в файле function.c его нет. Он также вызывает функцию newArray(5, 20), придавая размеру значение 5. Как исправить эту ошибку, чтобы размер структуры был равен 5? Спасибо, я был бы очень признателен за помощь.

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

1. Вам нужно установить array , прежде чем пытаться разыменовать его. Это неопределенное значение указателя.

2. Кроме того, struct Array не имеет члена width . Не будьте небрежны, но также публикуйте точный код, который вы пытаетесь, не показывайте нам ошибки, которые не относятся к вашему коду.

3. @Cheatah Я исправил код, приношу свои извинения, я неправильно ввел информацию.

Ответ №1:

Вам нужно включить заголовок Header.h , в котором определена структура, в модуль function.c , в котором определена функция.

В противном случае в этом определении функции

 struct Array *newArray(unsigned int width, unsigned int capacity ) {

  struct Array *array;

  array->width = width;

}
 

вводится спецификатор неполного типа struct Array . И компилятор, который компилирует этот модуль, не знает, содержит ли структура такие элементы данных, как width .

Хотя кажется, что фрагмент кода содержит опечатку, потому что определение структуры не содержит элемент данных width , и компилятор в сообщении ссылается на элемент данных size .

Также обратите внимание, что указатель array не инициализирован.

 struct Array *array;
 

и имеет неопределенное значение.

Поэтому в любом случае, даже если вы включите определение структуры, это утверждение

 array->width = width;
 

вызовет неопределенное поведение.

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

1. Я исправил свой код , я ввел «ширину», когда это должно было быть «размер»

2. @Raswall Это не очень важно. Я уже объяснил причину сообщения об ошибке.