gpt4 book ai didi

c - 可变函数的问题

转载 作者:太空宇宙 更新时间:2023-11-04 06:09:35 24 4
gpt4 key购买 nike

我在维护的一些遗留代码中具有以下功能。

long getMaxStart(long start, long count, const myStruct *s1, ...)
{
long i1, maxstart;
myStruct *s2;
va_list marker;

maxstart = start;

/*BUGFIX: 003 */
/*(va_start(marker, count);*/
va_start(marker, s1);

for (i1 = 1; i1 <= count; i1++)
{
s2 = va_arg(marker, myStruct *); /* <- s2 is assigned null here */
maxstart = MAX(maxstart, s2->firstvalid); /* <- SEGV here */
}

va_end(marker);
return (maxstart);
}

当仅使用一个 myStruct 参数调用该函数时,它会导致 SEGV。当我使用 VS2005 编译它时,代码在 Windows XP 上编译和运行没有崩溃。我现在已将代码移至 Ubuntu Karmic,但在 Linux 上使用更严格的编译器时遇到了问题。有没有人能够发现是什么原因导致无法在 var_arg() 语句中正确读取参数?

我正在使用 gcc 版本 4.4.1 进行编译

编辑

导致SEGV的语句是这个:

start = getMaxStart(start, 1, ms1);

当代码执行第一次到达这一行时,变量“start”和“ms1”具有有效值。

最佳答案

正如所写,当您只传入一个 myStruct 参数时,s1 将绑定(bind)到该参数,并且您的 va_list 将为空。然后,您在循环中做的第一件事是从该空列表中获取参数,因此是 NULL。

如果您需要至少一个参数并希望编译器为您进行类型检查,您必须执行如下操作:

long getMaxStart(long start, long count, const myStruct *s1, ...) {
...
va_start(marker, s1);
maxstart = s1->firstvalid; /* actually use s1 this time! */
for (i1 = 1; i1 < count; i1++) /* different from your code */
{
...
}
...
}

否则,你最好从函数定义中删除 s1,就像提到的 Potatoswatter:

long getMaxStart(long start, long count, ...) {
...
va_start(marker, count); /* not a bug */
maxstart = -1; /* pick something resonable for your app */
for (i1 = 0; i1 < count; i1++)
{
...
}
...
}

关于c - 可变函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2926005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com