You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言:局部函数变量修改全局变量值的异常行为问询

为什么全局变量clientes_dni被意外修改了?

这是C语言里字符串传参的典型误区——你以为自己只在操作局部变量,但实际上你的局部变量只是个指向全局数组的指针,修改指针指向的内容自然会改动原全局变量。

具体来说:

  • C语言传递字符数组给函数时,不会复制整个数组,只会传递数组的首地址。当你调用comprobarExistenciaDNI(clientes_dni)时,函数的参数(不管你写的是char *dni还是char dni[])本质上是个局部指针变量,它直接指向全局数组clientes_dni的内存起始位置。
  • 如果你在函数里对这个指针指向的内容做了修改(比如把最后一个字符转成小写'j'),其实就是直接在修改全局数组的内存空间。因为指针只是个"地址标签",不是独立的数组副本。

举个直观的例子,假设你的函数逻辑大概是这样:

void comprobarExistenciaDNI(char dni[]) {
    // 这里的dni是局部指针,指向全局clientes_dni的地址
    dni[8] = tolower(dni[8]); // 这行代码直接修改了原全局数组的第9个元素
}

哪怕你参数写的是char dni[],编译器也会把它解析成char *dni,所以操作dni的元素就是在动原全局变量的内容。

怎么避免这个问题?

如果你不想修改原全局变量,需要在函数内部创建一个局部数组副本,把传入的字符串复制过去再操作:

#include <string.h>
#include <ctype.h>

void comprobarExistenciaDNI(const char *dni) {
    // 创建局部副本,长度要足够容纳你的DNI(比如10位,包含终止符)
    char local_dni[10];
    strcpy(local_dni, dni);
    
    // 现在操作local_dni就不会影响原全局变量了
    local_dni[8] = tolower(local_dni[8]);
    
    // 后续逻辑用local_dni处理
}

这里把参数声明为const char *dni还能强制防止不小心修改原数组,是个值得养成的好习惯。

内容的提问来源于stack exchange,提问作者JuMoGar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:54:38