错误:滥用未定义类型'struct IntArray'

时间:2013-05-25 15:35:57

标签: c struct segmentation-fault malloc modularization

我想将这个程序编写在一个名为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);

,然后我可以编译我的程序,但是在启动它时,我得到一个分段错误,我认为我得到了因为main无法访问erzeugt

4 个答案:

答案 0 :(得分:0)

我猜你要返回一个本地(struct)变量的地址,当你以后尝试使用它时,会给你一个分段错误(试图访问一个无效的地址)。

您可以在函数中动态分配结构并将其返回。

        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
        }

答案 1 :(得分:0)

string = &(erzeugeArr(5));语句尝试获取表达式的地址(该函数返回类型struct IntArray的表达式。)只有对象具有地址,表达式不。

答案 2 :(得分: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);
}

或者,您也可以做一些稍微狡猾的事情,将结构分配给一个足够大的结构,以包含整行的内联数组:

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

答案 3 :(得分:0)

&amp;(erzeugeArr(5))很尴尬。它似乎返回该函数的地址。但是由于左值必需的错误,C编译器会失败。

请尝试以下方法: -

struct IntArray *string,s1;

s1=erzeugeArr(5);
string = (struct IntArray *) &s1;  // If you really require pointer access