从传递给函数的struct中编写成员会产生意外结果

时间:2015-12-20 13:42:00

标签: c struct io

首先 - 我的标题(.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字节文件,但没有预期的可识别部分(甚至不是#34; LIST&#34;):

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

在哪里&#34; ssss&#34;是大小和&#34; xxxx&#34;是任何随机数据(4个字节)。

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

1 个答案:

答案 0 :(得分:1)

使用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");,因为在函数调用时列表中没有有用的输入信息。