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