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

时间:2017-09-04 16:48:29

标签: c

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

感谢。

#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

2 个答案:

答案 0 :(得分:3)

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

  1. 在函数Encap中,您正在修改数组的内容。
  2. 函数Encap返回后,返回调用者,test数组的修改仍然存在。
  3. (您还询问了&#34; rvalue&#34;,这可能是一个重要的概念,但它并不像您期望的那样适用于此。)

    它的工作原理是因为两件事:

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

答案 1 :(得分:2)

您正在将指针传递给函数,它肯定会更改内存位置的值。 当您传递指针时,将创建另一个指针副本,并将在函数中使用。(每当我们调用一个函数时,就会复制变量并对该复制变量进行操作)。这里的变量是指针类型,因此将创建另一个指针变量,它将指向测试指向的相同内存位置,但将具有不同的地址。 这就是为什么在打印两个不同指针的地址时会打印两个不同的内存地址。