gpt4 book ai didi

c - main 中变量地址与函数中变量地址的区别

转载 作者:行者123 更新时间:2023-11-30 19:32:03 24 4
gpt4 key购买 nike

一个简单的问题,为什么function中的地址和main中的地址不一样?我尝试在没有 va_list 的情况下实现 printf,这对我来说是必要的,或者实现它是更好的主意,但我想早点知道答案。

 void func (char *format, ...)
{

char *p = (char *) &format + sizeof(format);

char *s = format;
for(;*s != '\0'; ++s) {
if (*s == '%') {
switch (*(s+1))
{

case 'd':
printf("%d - address\n", ((int *)p)); //This should point on second argument
p += sizeof (int);
++s;
break;
}
}
}
}

int main(int argc, char** argv) {
int a=2123213;
printf("%d - address\n",&a);
func("text%d",a);
}

最佳答案

我不认为你走在正确的道路上; C 编译器如何将参数传递给函数的方式大多是未指定的;它可能决定使用寄存器、堆栈或两者都使用;它还可能改变寄存器参数和堆栈参数之间的偏移量;因此,您的所有假设可能都成立,但对于不同的编译器或不同的平台,它们可能不再成立。也许您的编译器允许您以某种方式控制参数传递,但没有标准的方法来做到这一点。

C 标准引入了 va_list 结构和关联的宏,以便独立于这些实现细节。用这个;其他方式很可能是未定义的行为(例如,向指针添加一个整数值,使其指向“数组”的最后一个元素之外,或者通过这样的指针访问最后一个元素之后的元素是 UB;您的代码实际上是这样做的)。

关于c - main 中变量地址与函数中变量地址的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47520782/

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