gpt4 book ai didi

c - sprintf() 是否跨函数修改变量?

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

我用 sprintf() 来填充我的字符串,但是当我没有完成时,我发现了一些奇怪的东西,名称为 test 的 var 即使它是一个参数也可以修改,我认为它就像调用时的右值一样函数,或者这里是我没有注意到的地方,以下是我的代码和输出。

谢谢。

#include <stdio.h>
#include <stdlib.h>

void Encap(char str[9])
{
printf("%s\n", str);
sprintf(str, "hi e");
printf("%s\n%p\n", str, &str);
}

int main()
{
char test[9] = "ABC";

printf("%s\n", test);
Encap(test);
printf("%s\n%p\n", test, &test);

system("pause");
return 0;
}

输出

ABC
ABC
hi e
0061FF10
hi e
0061FF27

最佳答案

你声明了一个数组 test ,然后将其传递给函数 Encap .你的问题有点不清楚,但有两件事可能会让你感到惊讶:

  1. 在函数内Encap ,您正在修改数组的内容。
  2. 函数之后Encap在调用者中返回对 test 的修改数组持久化。

(您还询问了“右值”,这可能是一个重要的概念,但它并不像您期望的那样适用于此。)

这样做的原因有两点:

  1. 当你传递数组时 test到函数 Encap ,您不会传递数组的整个值。实际传递的只是指向数组第一个元素的指针。
  2. 在函数内Encap ,您不是在修改传递的指针,而是在修改指针指向的内存。您正在使用指针作为值(指针值)来了解您应该修改的内存位置——这最终成为 test。在 main() 中排列.

关于c - sprintf() 是否跨函数修改变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041367/

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