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来查找长度吗?