【问题标题】:Logical error with return value from struct in cc中结构返回值的逻辑错误
【发布时间】:2015-10-30 12:24:22
【问题描述】:

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

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

我该如何解决这个问题?

谢谢,

【问题讨论】:

  • 嗯...'缓冲区'....你释放了它...
  • 您缺少来自functreturn
  • 删除free(buffer)。你想继续使用这个缓冲区。在末尾添加return result;
  • 这个函数是正确的,有这些变化。如果您仍然有错误,则它必须在您未发布的代码中。我们很难调试您没有发布的代码。要获得好的答案,请发帖MCVE
  • 在编辑后的代码中你永远不会调用你的函数。您只需声明一个未初始化的变量result,然后使用它。也许你的意思是struct Bar result = funct();

标签: c struct


【解决方案1】:

你的代码有问题 -

 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

注意 - 你说你想从函数中return 一些东西,但你的代码似乎没有这样做。

【讨论】:

  • 摆脱免费通话就可以解决“缓冲”问题。由于它是调用的,因此将其地址推入结构并返回结构就可以了。
  • ..但是逗号操作符太可怕了,你上面的代码清晰了一百万倍:)
  • @MartinJames 是的,可能是 OP 是新的并且不知道它。无论如何谢谢:-)
  • 我希望开发人员不要再编写聪明的东西,然后发现他们无法调试它:) 您的代码,我可以使用调试器逐行执行。简单!
  • "之后释放它" - 实际上它不应该在这个函数中被释放,它正在被返回
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2022-11-29
  • 1970-01-01
相关资源
最近更新 更多