首先 - 我的标题(.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>
答案 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");
,因为在函数调用时列表中没有有用的输入信息。