Ошибка: неправильное использование неопределенного типа 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.) Только объекты имеют адреса, выражения не имеют.

Другие вопросы по тегам