2013-05-25 2 views
0

Я хочу написать эту программу, где у меня есть это в одном файле с именем intarray.c:Ошибка: неправильное использование неопределенного типа «STRUCT INTArray»

#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)); 

Теперь, что я получаю это:

Misuse of undefined type "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?

+0

Просьба [короткий, автономный, правильный пример] (http://sscce.org/). Из того, что я вижу, причина может быть тривиальной, так как забыть включить заголовок. Но это трудно сказать, когда я не вижу, что вы на самом деле пытаетесь скомпилировать. – Oswald

+0

Почему вы не использовали обычный массив, чем удаленный массив? –

+0

В обоих случаях вы возвращаете локальную переменную из функции. Время, чтобы прочитать о * переменной области * в C. – kotlomoy

ответ

0

Я думаю, вы возвращаете адрес локальной (структурной) переменной, которая при попытке использовать ее позже даст вам ошибку сегментации (попытка получить доступ к недопустимому адресу).

Вы можете динамически распределять структуру в функции и возвращать ее.

 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 
     } 
+0

Большое спасибо! Оно работает! Не знаю, почему я не пробовал это так^^ Тем не менее у меня все еще есть эта проблема, когда я хочу получить доступ к длине структуры str, указывающей в основном. Я попробовал str-> length и получил ошибку «разыменование указателя на неполный тип». Как сказал wildplasser, выражение типа struct IntArray не имеет адреса, поэтому, я думаю, я понимаю, почему он не работает таким образом, но я не знаю, как я могу это сделать иначе ... – user2420548

+0

вы хотите сделать это по-другому? – Dineshkumar

+0

За исключением str-> length, да, потому что это не работает – user2420548

0

string = &(erzeugeArr(5)); оператор пытается взять адрес выражения (функция возвращает выражение типа struct IntArray.) Только объекты имеют адреса, выражения не делают.

0

Вы могли бы сделать что-то вроде этого:

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

Кроме того, вы также можете сделать что-то немного хитрее, который выделяет-структуру с размером достаточно большой, чтобы содержать массив Ints инлайн:

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); 
} 
+0

Спасибо за помощь! – user2420548

0

& (erzeugeArr (5)) неловко. Кажется, он возвращает адрес функции. Но компилятор C завершится ошибкой из-за ошибки, требуемой lvalue.

Вместо этого попробуйте следующее: -

struct IntArray *string,s1; 

s1=erzeugeArr(5); 
string = (struct IntArray *) &s1; // If you really require pointer access 
Смежные вопросы