gpt4 book ai didi

c - 如果传递的参数是常量值,C 中会发生什么

转载 作者:行者123 更新时间:2023-11-30 19:56:01 25 4
gpt4 key购买 nike

假设我有一个主要功能如下:

void main()
{ int *p;
p = foo(31);
printf(“%d”, (*p)+2);
bar(7); /* Body of function bar() not shown */
printf(“%d”, (*p)+4);
}

int *foo(int x)
{
return &x;
}

假设函数 bar() 编译正确,如果 bar() 的主体未写入其传入参数空间,为什么 printf 的第二个结果是 11

更具体地说,我的问题是为什么 bar() 的传入参数值 7 会替换值 31

另外,当main函数将值31传递给foo()时,值31是如何传递的呢?通过注册?或者编译器创建一个临时变量来传递 31?为什么 foo()bar() 的传入参数在内存中共享相同的位置

最佳答案

函数参数是其局部变量。所以在这个函数定义中

int *foo(int x) 
{
return &x;
}

返回一个指向局部变量的指针。

因此,程序具有未定义的行为。

您可以按以下方式想象函数定义及其调用

p = foo(31);

int *foo( /* int x */ )
{
int x = 31;
return &x;
}

变量x在退出函数后将不再存在。因此,该指针具有无效值,该值不指向实际对象。为函数 foo 的参数分配的内存可以通过调用其他函数来覆盖,例如调用函数 printf..

考虑到根据 C 标准,不带参数的函数 main 应声明为

int main( void )

和函数foo应该在使用之前声明。否则编译器会发出一条消息,指出使用了不兼容的类型或找不到相应的函数。

关于c - 如果传递的参数是常量值,C 中会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44033279/

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