繁体   English   中英

将成员从struct传递到函数会产生意外结果

[英]Writing members from struct passed to function gives unexpected result

首先,我的标头(.h)文件如下所示:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

typedef struct riff_list {
    char id[4];
    uint32_t cksize;
    char subid[4];
    uint8_t *buf;
} list_t;

void write_u32_le(uint32_t n, FILE *f)
{
    uint8_t i, buf[4];

    for (i = 0; i < 4; i++)
    {
        buf[i] = n & 0xFF;
        n >>= 8;
    }

    fwrite(buf, 1, 4, f);
}

void init_list_chunk(list_t list, char *cktype)
{
    memcpy(list.id, "LIST", 4);
    list.cksize = 0;
    memcpy(list.subid, cktype, 4);
}

void write_list_chunk(list_t list, FILE *f)
{
    fwrite(list.id, 1, 4, f);
    write_u32_le(4 + list.cksize, f);
    fwrite(list.subid, 1, 4, f);
    fwrite(list.buf, 1, list.cksize, f);
}

现在,问题出在基本的测试程序试图向文件中写入内容。 如预期的那样出来:

int main()
{
    FILE *f;
    list_t list;

    memcpy(list.id, "LIST", 4);
    list.cksize = 0;
    memcpy(list.subid, "TEST", 4);

    f = fopen("C:\\listtest.bin", "wb");
    fwrite(list.id, 1, 4, f);
    write_u32_le(4+list.cksize, f);
    fwrite(list.subid, 1, 4, f);
    list.buf = malloc(4);
    fwrite(list.buf, 1, 4, f);

    free(list.buf);
    fclose(f);
}

尽管这只会产生一个4096字节的带有垃圾文件,但没有可识别的部分(甚至没有“ LIST”):

int main()
{
    FILE *f;
    list_t list;

    init_list_chunk(list, "TEST");
    list.buf = malloc(4);
    list.cksize += 4;

    f = fopen("C:\\listtest.bin", "wb");
    write_list_chunk(list, f);

    free(list.buf);
    fclose(f);
}

为什么是这样? 为什么后一种方法不能按预期工作?

预期的输出应类似于:

LIST
ssss
TEST
xxxx

其中“ ssss”是大小,“ xxxx”是任何随机数据(4个字节)。

我已经看到了将结构作为指针传递给它们的方法( &my_struct_var ),并通过将它们作为my_struct_var->member递归来访问函数中的my_struct_var->member ,但是我可以按原样传递结构吗?

out = func(in);调用函数 意味着,如果函数修改的内容in这些修改将只在函数内部可见。 当函数返回调用函数仍然有变量中的内容相同in 通过值进行调用可以描述为被调用函数获得其自己的变量副本。

您有两种选择来解决您的问题:

1)正如您已经建议自己那样,您的函数init_list_chunk可以采用指向您的结构的指针。 然后,通过修改结构,指向这些修改的指针也可用于调用函数。

2)您可以使用init_list_chunk返回修改后的结构,而不是返回void。 类似的东西: list = init_list_chunk(list, "TEST"); 甚至list = init_list_chunk("TEST"); 因为在函数调用时列表内没有有用的输入信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM