Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 错误:误用未定义的类型';结构IntArray';_C_Struct_Segmentation Fault_Malloc_Modularization - Fatal编程技术网

C 错误:误用未定义的类型';结构IntArray';

C 错误:误用未定义的类型';结构IntArray';,c,struct,segmentation-fault,malloc,modularization,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

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

因为最后一位是
字符串=…
。我找了很多,但我不明白问题所在!如果我这样做:

void erzeugeArr(struct IntArray *erzeuge, int length)
{
    struct IntArray erzeugt = {length, (int *)malloc(sizeof(int)*length)};
    erzeuge = &erzeugt;
}
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);
}


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

我猜您返回的是一个局部(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
        }

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

您可以执行以下操作:

void erzeugeArr(struct IntArray *erzeuge, int length)
{
    struct IntArray erzeugt = {length, (int *)malloc(sizeof(int)*length)};
    erzeuge = &erzeugt;
}
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);
}
或者,您也可以做一些更隐蔽的事情,以足够大的大小分配结构,以包含内联int数组:

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);
}
&(Erzeugarr(5))很尴尬。它似乎返回函数的地址。但由于左值必需错误,C编译器将失败

请尝试以下方法:-

struct IntArray *string,s1;

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

请提供一份报告。据我所见,原因可能很简单,比如忘记包含标题。但当我看不到您实际试图编译的内容时,很难说。为什么不使用普通数组而不是敲击数组?在这两种情况下,您都是从函数返回局部变量。是时候阅读C中的变量范围了。非常感谢!!它起作用了!我不知道为什么我没有这样做^^^然而,当我想访问str在主体中指向的结构的长度时,我仍然有这个问题。我尝试了str->length,得到了错误“取消对不完整类型指针的引用”。就像下面wildplasser所说的,struct IntArray类型的表达式没有地址,所以我想我知道它为什么不能这样工作,但我不知道,我怎么才能不这样做…你想用其他方式吗?你是指整个元素的长度?为什么不简单地使用intar或arr[]?如果它的char可能会说它的行为类似于string。你的目的是什么?它必须是一个由数组及其长度组成的结构。这就是任务。为了测试main中的功能,我想访问结构中的长度。您不能简单地使用array并使用sizeof来查找长度吗?