【问题标题】:Error: misuse of undefined type 'struct IntArray'错误:误用未定义类型“struct IntArray”
【发布时间】:2013-05-25 15:35:57
【问题描述】:

我想在一个名为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

【问题讨论】:

  • 请提供short, self contained, correct example。据我所知,原因可能很简单,因为忘记包含标题。但是当我看不到您实际尝试编译的内容时,这很难说。
  • 你为什么不使用普通数组而不是敲击数组?
  • 在这两种情况下,您都是从函数返回局部变量。是时候了解一下 C 中的变量范围了。

标签: c struct segmentation-fault malloc modularization


【解决方案1】:

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

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

        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
        }

【讨论】:

  • 非常感谢!!有用!不知道为什么我不这样尝试^^不过,当我想访问结构str指向的结构的长度时,我仍然遇到这个问题。我尝试了 str->length,并得到错误“取消引用指向不完整类型的指针”。就像下面所说的 wildplasser,struct IntArray 类型的表达式没有地址,所以我想我明白为什么它不能以这种方式工作,但我不知道,否则我该怎么做......
  • 你想换一种方式吗?
  • 您的意思是总元素的长度?为什么不简单地使用 intarr 或 arr[]?如果它的 char 可能会说行为像字符串。你的目的是什么?
  • 它必须是由数组及其长度组成的结构。这就是任务。为了测试主要的功能,我想访问结构中的长度。
  • 不能简单的用数组,用sizeof求长度吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以这样做:

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

    【讨论】:

      【解决方案4】:

      &(erzeugeArr(5)) 很尴尬。它似乎返回了函数的地址。但是 C 编译器会因为 lvalue required 错误而失败。

      请尝试以下方法:-

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-07
        • 2019-01-07
        相关资源
        最近更新 更多