【发布时间】:2013-01-10 07:14:33
【问题描述】:
我在 C 语言中有一个函数,它正在从文本文件中读取未知数量的行。
我正在将行中的数据插入到我拥有的struct 中。
每一行我都在用realloc 增加结构的大小。
一切都很好,但是该函数返回这个struct,并且应该插入到程序的“main”struct。从我的思维方式来看,它不应该起作用,而且它也不起作用。
我不知道应该给主struct分配多少空间,然后我尝试比较一个更大的struct。
代码很长,但我基本上是这样做的:
int* blah()
{
int *x;
x=(int*)malloc(sizeof(int)*3);
x[0]=1;
x[1]=2;
x[3]=3;
return x;
}
int main()
{
int *y, *z;
y=(int*)malloc(sizeof(int)*1);
z=y;
z = blah();
return 0;
}
我怎么知道我应该增加多少y?
附言
如果我将 malloc 设为 10 并且文件中有 5 行,那么它就可以正常工作(正如我所料)。
谢谢
编辑: 我正在构建的这个程序是为学校设计的,我得到了读取函数的原型,它只返回结构并获取指向文件的指针。所以我不能发送更多的变量。
编辑 2: 结构:
typedef struct
{
int x;
int y;
}POINT;
typedef struct
{
POINT points[SHAPE_TYPE];
}POLIGON;
typedef struct
{
POLIGON poly;
float sides[SHAPE_TYPE];
}RECORD;
读取函数:
RECORD* Read(FILE* F)
{
RECORD* rec;
int i=1,j;
rec = (RECORD*)malloc(PACK*sizeof(RECORD));
if (rec == NULL)
{
exit(1);
}
rec[0].poly.points[0].x=0;
if(F == NULL)
{
printf("Could not open a file for reading. Exiting....\n");
exit(1);
}
while (!feof(F))
{
if(rec[0].poly.points[0].x==(sizeof(*rec)/sizeof(RECORD)-1))
rec = (RECORD*)realloc(rec,((sizeof(*rec)/sizeof(RECORD))+PACK)*sizeof(RECORD));
if (rec == NULL) {
exit(1);
}
for(j=0; j<SHAPE_TYPE; j++)
fscanf(F, "%d,%d,%f,",&rec[i].poly.points[j].x,&rec[i].poly.points[j].y,&rec[i].sides[j]);
fscanf(F,"\n");
rec[0].poly.points[0].x=i;
i++;
}
fclose(F);
return rec;
}
我这样称呼它:
RECORD* rec,p;
FILE *f;
rec = (RECORD*)malloc(PACK*sizeof(RECORD));
p=rec;
f=NULL;
f = fopen("Save.txt", "r");
p = Read(f);
我不能使用全局变量。
PACK - 常量数。我应该用这个数字增加数组。
SHAPE_TYPE - 常量 - 多边形的点数。
在数组的第一个单元格中 -> rec.[0].poly.points[0].x - 这是我应该在数组中保存实际 RECORDs 的数字的地方,所以我从 [1] 开始填充它。
基本上,我要做的是在main() 中创建array 的RECORD,然后使用创建另一个未知大小数组的函数从文件中读取并返回RECORD 的指针(数组)。
简单的方法是将指针数组从主函数发送到函数并且不返回任何内容(void),但我不得不使用这个原型。
【问题讨论】:
-
不幸的是,您的精简模型中没有结构(还有一些内存泄漏,但我假设您现在更关心扩展,这些泄漏是代码剥离)。如果可能,您能否详细说明
main()中的初始分配(包括结构定义)以及如何在您的阅读器功能中扩展的更多细节?我认为这是可行的,只需将初始分配传递给您的阅读器,然后让它根据需要扩展它。 -
是的,我知道没有结构,我试图在我的原始程序中犯同样的错误(我认为它与结构无关)我知道我没有在我的示例中不要使用
free()。结构很少,一个在另一个里面,如果我把所有的都贴在这里,它会很长而且不太可读,所以我试图做同样的动作,但是用这个int。 -
不用担心。从文件中读取的 thing 是否应该与 main 中分配的 thing 进行“比较”(二进制、逐项等)?这是两难境地吗?
-
为什么需要
main中的数据?为什么不只是一个指针? -
我正在创建一个主要的结构。我正在调用从文件中读取并构建结构数组并将其返回(作为指针)的函数。我想构造我在 main 中创建的值将是我从函数返回的结构。