C语言中如何指向并修改全局变量
关于全局变量修改与乱码问题的解答
兄弟,先给你明确一个核心结论:如果你修改的是全局变量,完全不需要在函数末尾返回它们!因为全局变量的作用域覆盖整个程序,只要你在userval函数里正确修改了它们,在main函数里直接访问就能拿到修改后的值,根本不用多此一举返回。
至于你遇到的打印乱码问题,大概率和返回值无关,我给你分析几个常见原因,再给你点排查方向:
常见乱码原因及排查步骤
- 变量类型或初始化问题
如果你的全局变量是字符串,比如定义成char *username;但没给它分配内存,直接往里面写输入内容,就会导致非法内存访问,打印出来自然是乱码。正确的做法应该是用固定长度的字符数组,比如char username[50];,这样才有足够的空间存输入的内容。 - 输入输出编码不匹配
比如在Windows系统下,控制台默认用GBK编码,但你的代码如果是UTF-8编码的,打印中文就会乱码。这种情况可以在程序开头加两行代码(需要包含<windows.h>)强制设置控制台编码为UTF-8:SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); - 输入处理不当导致缓冲区溢出
如果你用scanf("%s", username)读取字符串,一旦用户输入的长度超过数组的大小,就会溢出破坏其他内存区域,不仅会乱码,甚至可能导致程序崩溃。建议用fgets来读取字符串,更安全:fgets(username, sizeof(username), stdin); // 别忘了去掉fgets自动读取的换行符 username[strcspn(username, "\n")] = '\0'; - 调用顺序错误
你是不是在调用userval函数之前就打印全局变量了?那时候变量还没被赋值,打印的就是内存里的垃圾数据,看起来也是乱码。一定要确保先调用userval修改变量,再在main里打印。
可参考的示例代码
#include <stdio.h> #include <string.h> // 如果是Windows系统,需要加这个头文件来设置编码 // #include <windows.h> // 定义全局变量 char user_name[50]; int user_age; void userval() { printf("请输入用户名:"); fgets(user_name, sizeof(user_name), stdin); // 移除换行符 user_name[strcspn(user_name, "\n")] = '\0'; printf("请输入年龄:"); scanf("%d", &user_age); // 清理输入缓冲区的残留换行,避免影响后续操作 while (getchar() != '\n'); } int main() { // Windows下设置控制台编码为UTF-8,解决中文乱码 // SetConsoleOutputCP(CP_UTF8); // SetConsoleCP(CP_UTF8); // 先调用函数修改全局变量 userval(); // 再打印变量 printf("你输入的用户名:%s,年龄:%d\n", user_name, user_age); return 0; }
你可以对照上面的内容检查自己的代码,看看是哪一步出了问题。如果还是解决不了,把你的代码贴出来,我再帮你细查~
内容的提问来源于stack exchange,提问作者Thomas Butterfield
相关产品推荐
相关产品推荐

