我必须从C中的结构中返回两个值:
我有以下数据结构:
struct Bar
{
char *x;
long y;
};
struct Bar funct();
struct Bar funct()
{
struct Bar result;
FILE *fp;
long lSize;
char *buffer;
fp = fopen("list.txt", "rb");
if (!fp) perror("list.txt"), exit(1);
fseek(fp, 0L, SEEK_END);
lSize = ftell(fp);
rewind(fp);
buffer = calloc(1, lSize+1);
if(!buffer) fclose(fp), fputs("memory alloc fails", stderr), exit(1);
if (1!=fread(buffer, lSize, 1, fp))
fclose(fp), free(buffer), fputs("entire read fails", stderr), exit(1);
fclose(fp);
free(buffer);
printf("%ld\n", lSize);
result.x = (char *) buffer;
result.y = lSize;
}
而不是结构,当我在char函数中实现相同的代码时,我习惯将缓冲区作为char数组,并将lSize作为744。
我的主要功能如下:
int main()
{
char *buffer;
printf("Reading file...\n");
//buffer = readFile();
struct Bar result;
buffer = result.x;
printf("%s\n", buffer);
printf("%ld\n", result.y);
//collect_character_distribution(buffer);
return 0;
}
但是在结构上,我没有从*缓冲区获取数组值,而我从lSize得到0。我需要返回* buffer和lSize值。出于这个原因,我必须使用struct。
我该如何解决问题?
谢谢,
答案 0 :(得分:5)
您的代码存在问题 -
"p4d -n -p 1666"
您 free(buffer); // don't free it earlier, you later use it
printf("%ld\n", lSize);
result.x = (char *) buffer; //casting is not needed
free
然后让buffer
指向它。 result.x
之后调用函数。
而这 -
free
你应该避免这样写作。它代表非常不清楚。
你可以这样写清楚 -
if (1!=fread(buffer, lSize, 1, fp))
fclose(fp), free(buffer), fputs("entire read fails", stderr), exit(1);
也相应地对前一个 if(1!=fread(buffer, lSize, 1, fp)){
fclose(fp);
free(buffer);
fputs("entire read fails", stderr);
exit(1);
}
进行更改。
注意 - 你说你想要if
来自函数的东西,但你的代码似乎没有这样做。