以前我有一个函数f(double *a)
,它有一个数组可以处理。为了获得正确的位置,它应该在数组上工作,它被称为f(a+offset)
,offset
是一个整数。现在我重新编写了代码,并定义了一个自定义结构:
typedef struct{
double *a;
} struName;
,功能更改为f(struName *a)
。现在我想知道如何仍然可以获得函数的偏移量,而不必创建新的临时struct
或者必须将函数从f(struName *a)
更改为f(struName *a, int offset)
。这甚至可能吗?
答案 0 :(得分:2)
在不更改结构内容或调用未定义行为的情况下,这是不可能的。
如果您有权访问ISO C99,则可以更改签名以接受struct
的值,并传入复合文字:
f((struct struName){ .a = myStruct.a + offset });
否则您提出的解决方案与不同的参数应该可以正常工作:
f(myStruct, offset);
答案 1 :(得分:2)
最佳解决方案是更改函数以获取偏移参数。
如果这不是一个选项,那么第二个最佳解决方案是将结构定义更改为包含偏移成员(如果这在设计上有意义的话)。
如果那也不是一个选项,那么第三个最佳解决方案就像Leandros的答案一样:创建一个临时结构并在将指针传递给临时结构之前更改指针成员。也就是说,将结构视为 immutable - 如果可能的话,使指针成员const
。这使程序设计保持干净,但您必须制作结构的额外副本。