Ошибка: неправильное использование неопределенного типа struct IntArray
Я хочу написать эту программу, где у меня есть это в одном файле с именем intarray.c
:
#include <stdio.h>
#include <stdlib.h>
#include "intarray.h"
struct IntArray
{
int length;
int *array;
};
struct IntArray erzeugeArr(int length)
{
struct IntArray erzeugt = {length, (int *)malloc(sizeof(int)*length)};
return erzeugt;
}
и это в главном тесте:
struct IntArray *string;
string = &(erzeugeArr(5));
Теперь, что я получаю, это:
Неправильное использование неопределенного типа "struct IntArray"
из-за последней биты с string = …
, Я много искал, но не понимаю проблемы! Если я сделаю это так:
void erzeugeArr(struct IntArray *erzeuge, int length)
{
struct IntArray erzeugt = {length, (int *)malloc(sizeof(int)*length)};
erzeuge = &erzeugt;
}
а также
struct IntArray *string;
erzeugeArr(string, 5);
затем я могу скомпилировать свою программу, но при ее запуске я получаю ошибку сегментации, которую, как я полагаю, я получаю, потому что основная не имеет доступа к erzeugt
?
4 ответа
Я предполагаю, что вы возвращаете адрес локальной (структурной) переменной, которая, когда вы попытаетесь использовать ее позже, вызовет ошибку сегментации (попытка получить доступ к неверному адресу).
Вы можете динамически размещать структуру в функции и возвращать ее.
struct IntArray* erzeugeArr(int length)
{
struct IntArray *erzeugt=(struct IntArray*)malloc(sizeof(struct IntArray*));
erzeugt->array = (int*) malloc(sizeof (int)*length);
return erzeugt;
}
int main()
{
struct IntArray *str;
str=erzeugeArr(10);
//use str for processing
}
Вы могли бы сделать что-то вроде этого:
struct IntArray
{
int length;
int *array;
}
struct IntArray *alloc_arr(int length)
{
struct IntArray *erzeugt = calloc(sizeof(struct IntArray));
erzeugt->length = length;
erzeugt->array = calloc(length * sizeof(int));
return erzeugt;
}
void free_arr(struct IntArray *p)
{
free(p->array);
free(p);
}
В качестве альтернативы, вы также можете сделать что-нибудь более хитрое, чтобы выделить структуру в достаточно большом размере, чтобы он содержал встроенный массив in t:
struct IntArray
{
int length;
int array[1];
}
struct IntArray *alloc_arr(int length)
{
struct IntArray *erzeugt = calloc(sizeof(struct IntArray) + (length-1) * sizeof(int));
erzeugt->length = length;
return erzeugt;
}
void free_arr(struct IntArray *p)
{
free(p);
}
&(erzeugeArr(5)) неудобно. Кажется, чтобы вернуть адрес функции. Но компилятор C потерпит неудачу из-за ошибки, необходимой для lvalue.
Вместо этого попробуйте следующее:
struct IntArray *string,s1;
s1=erzeugeArr(5);
string = (struct IntArray *) &s1; // If you really require pointer access
string = &(erzeugeArr(5));
оператор пытается получить адрес выражения (функция возвращает выражение типа struct IntArray
.) Только объекты имеют адреса, выражения не имеют.