[英]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.