C - 局部函数变量chages Scope(全局)变量的值错误行为

时间:2018-03-11 18:45:18

标签: c

我有一个名为char clientes_dni[]的全局变量。我(从主要)调用一个函数:comprobarExistenciaDNI(clientes_dni)。我的函数comprobarExistenciaDNI是:

bool comprobarExistenciaDNI(char DNI[]) {
    /// Change to lower DNI last word
    DNI[8] = tolower(DNI[8]);
    return (true);
}

如果我的var的值为'11111111J',则在函数之后值为'11111111j'。我不使用全局变量,只使用局部变量,所以......为什么clientes_dni的值被改变了?

谢谢。

3 个答案:

答案 0 :(得分:3)

我认为问题是DNI是一个数组(一个指针)所以当你说

时你实际上正在修改数组的内容
DNI[8] = tolower(DNI[8]);

通过引用函数发送变量就好了。

你有使用指针的经验吗?

编辑1:

我会给你一个快速扰流板。指针是内存地址的值。就像我说的,一个数组就是一个指针,这个指针就是一个指针。到内存中数组的第一个元素(元素是彼此相邻的元素)所以当你发送clientes_dni时,你将第一个元素的位置发送到comprobarExistenciaDNI函数。然后,该函数修改该内存地址的值(内容)。这就是为什么它在主范围内被修改的原因,因为你修改了内存地址的内容。

当您发送任何其他数据类型的变量时,您发送的是变量的副本而不是变量本身。

答案 1 :(得分:1)

数组通过第一个元素的地址传递。在大多数用例中(例如sizeof运算符之类的例外),数组的名称(让我们说A)与&A[0]同义。 structs是按值传递的,如果这是你要做的事情(将数组包装在struct中)。

答案 2 :(得分:1)

您的局部变量是指针类型,它引用全局字符串。 '阵列'函数的参数不会被分配和深度复制,而是绑定到地址。