Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构中的函数指针不工作_C_Function_Struct - Fatal编程技术网

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新手,但这似乎不是我的错,我在函数中正确地使用了传递它的参数,现在我被卡住了…不知道该怎么办。