C 结构中的函数指针不工作
假设我有一个这样的结构:C 结构中的函数指针不工作,c,function,struct,C,Function,Struct,假设我有一个这样的结构: typedef struct myInfo { WORD myCount; WORD data[0]; } myInfo; void dynamic_init(struct myInfo dummy){ macroPut(5, dummy.myCount, &dummy.mydata); <- doesn't work macroPut(5, dummy.myCount, &externalInitia
typedef struct myInfo {
WORD myCount;
WORD data[0];
} myInfo;
void dynamic_init(struct myInfo dummy){
macroPut(5, dummy.myCount, &dummy.mydata); <- doesn't work
macroPut(5, dummy.myCount, &externalInitialized.mydata); <- works
}
dynamic_init( externalInitialized.myCount, externalInitialized.mydata);
我想在另一个.c源文件中使用这个结构(顺便说一句,它是declare extern),其中我有一个如下函数:
typedef struct myInfo {
WORD myCount;
WORD data[0];
} myInfo;
void dynamic_init(struct myInfo dummy){
macroPut(5, dummy.myCount, &dummy.mydata); <- doesn't work
macroPut(5, dummy.myCount, &externalInitialized.mydata); <- works
}
dynamic_init( externalInitialized.myCount, externalInitialized.mydata);
这行不通
换言之,我必须这样做:
typedef struct myInfo {
WORD myCount;
WORD data[0];
} myInfo;
void dynamic_init(struct myInfo dummy){
macroPut(5, dummy.myCount, &dummy.mydata); <- doesn't work
macroPut(5, dummy.myCount, &externalInitialized.mydata); <- works
}
dynamic_init( externalInitialized.myCount, externalInitialized.mydata);
我得到了预期的结果
主要的误解是“mydata”这个词会破坏一切。
如果我这样做,“myCount”将按预期工作:
dynamic_init(externalInitialized);
dynamic_init( externalInitialized, externalInitialized.mydata);
然后:
void dynamic_init(结构外部初始化虚拟,单词*dynda){
macrocut(5,dummy.myCount,&dynda);当您将结构传递给函数时,编译器生成代码来复制结构内容,这样函数就可以获得自己的参数副本,可以在不影响原始值的情况下自由修改。复制是针对sizeof struct
字节执行的
这里的主要问题是,您的结构有,因此它的sizeof
与它将占用的实际大小几乎没有关系
例如,有问题的结构sizeof
是4(最后一个字段是由0个元素组成的数组,所以它不会增加sizeof),但当您为结构分配内存时,实际上分配了更多的内存,并在结构字段中保存了“实际”大小。这样,访问数据数组实际上会得到结构本身之外的元素(放在它旁边的字节);但是,编译器不知道这一点(也不知道,因为不同结构实例的大小不同)。出于同样的原因,您不能直接将该结构放在堆栈上并安全地填充数据,因为这将触及不属于它的字节并损坏其他内容(从技术上讲,它可以放在堆栈上,但您必须在足够大的堆栈阵列中手动对齐它)
灵活的数组成员还有其他限制,比如您不能创建这种类型的结构的数组(从技术上讲,您也可以,但这毫无意义,因为数组索引依赖于sizeof
)
所以,简短的回答是“不要按值传递灵活大小的结构”。或者在按值传递结构之前要三思而后行——毕竟复制不是免费的。什么是“另一个函数”?这是一个类型定义,正如单词typedef
所暗示的那样,它不是一个结构声明,也不是一个结构声明。请发布一个声明,并定义您尝试过的内容、想要实现的内容以及实际得到的内容。请不要期望我们猜测“不起作用”可能意味着什么。请注意word mydata[0]
是一个零大小的数组。&dummy.mydata
不会产生超出结构的指针。正如Hans所问,“工作”和“不工作”是什么意思。伙计们,你们说得很对,但我有一个“.a”我以为我遗漏了什么,因为我是C新手,但这似乎不是我的错,我在函数中正确地使用了传递它的参数,现在我被卡住了…不知道该怎么办。