c - c中结构体返回值出现逻辑错误

标签 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 函数中实现相同的代码时,我通常将 buffer 获取为 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;
}

但在结构中,我没有从 *buffer 中获取数组值,而是从 lSize 中获取 0。我需要返回 *buffer 和 lSize 值。因此我必须使用结构。

如何解决这个问题?

谢谢

最佳答案

您的代码有问题 -

 free(buffer);                      // don't free it earlier, you later use it 
 printf("%ld\n", lSize);
 result.x = (char *) buffer;       //casting is not needed

释放 缓冲区,然后使result.x指向它。之后在调用函数时释放它。

还有这个 -

 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也进行相应的更改。

注意 - 您说您想从函数中返回某些内容,但您的代码似乎没有这样做。

关于c - c中结构体返回值出现逻辑错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33435929/

相关文章:

ios - 无法将结构附加到数组属性

c - 结构体字段中的数组在返回时是否始终保留?

data-structures - []map[string]struct 错误的 Golang 赋值

c - 从一个 header 结构到另一个 header 中的结构体

C:将年/月...转换为字符串(字符数组)?

c - 在 Linux 上将密码从 GUI 传递到 CLI。

c - 结构 C 中的双重取消引用

c - 程序集 : Returning 64 bits pointer address (nasm unix x64)

c - 向 binutils 2.25 添加新指令

c - 在 c 中有一个结构的 void* 成员是什么意思?