c中返回值与struct的逻辑错误

时间:2015-10-30 12:24:23

标签: c struct

我必须从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。

我该如何解决问题?

谢谢,

1 个答案:

答案 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来自函数的东西,但你的代码似乎没有这样做。