为何第一段C语言结构体代码无法运行,第二段却可行?
为什么传递全局结构体变量给函数后无法正常工作?
我写了两段C语言代码,第一段尝试通过函数参数传递全局结构体变量,但无法正常运行;修改后的第二段直接操作全局变量却能正常工作,想请教原因。
第一段代码(无法运行):
#include <stdio.h> struct MovieData { char title[50]; char director[50]; int year; int runningTime; } movie; void movieInfo(struct MovieData a) { scanf(" %[^\n] %[^\n] %d %d", a.title, a.director, &a.year, &a.runningTime); } void moviePrint(struct MovieData a) { printf("title: %s\ndirector: %s\nrelease year: %d\nrunning time: %d", a.title, a.director, a.year, a.runningTime); } int main(void) { movieInfo(movie); moviePrint(movie); return 0; }
第二段代码(可以正常运行):
#include <stdio.h> struct MovieData { char title[50]; char director[50]; int year; int runningTime; } movie; void movieInfo() { scanf(" %[^\n] %[^\n] %d %d", movie.title, movie.director, &movie.year, &movie.runningTime); } void moviePrint() { printf("title: %s\ndirector: %s\nrelease year: %d\nrunning time: %d", movie.title, movie.director, movie.year, movie.runningTime); } int main(void) { movieInfo(); moviePrint(); return 0; }
这核心原因是C语言的函数参数默认是值传递,哪怕你传递的是全局变量也不例外:
- 在第一段代码里,当你调用
movieInfo(movie)时,程序会创建全局变量movie的一个副本,把这个副本传递给函数的参数a。你在movieInfo里用scanf修改的都是这个副本的数据,而原始的全局变量movie根本没被改动。之后调用moviePrint(movie)时,传递的还是未被修改的原始全局变量,自然打印不出你输入的内容。 - 第二段代码里,
movieInfo和moviePrint直接操作全局变量movie,所有读写都是直接作用在原始变量上,所以输入的数据能被正确保存并打印。
如果你想保留函数参数的写法让第一段代码正常工作,只需要把参数改成指针类型,让函数直接操作原始变量的内存:
修改后的第一段代码示例:
#include <stdio.h> struct MovieData { char title[50]; char director[50]; int year; int runningTime; } movie; void movieInfo(struct MovieData *a) { // 用->访问指针指向的结构体成员 scanf(" %[^\n] %[^\n] %d %d", a->title, a->director, &a->year, &a->runningTime); } void moviePrint(struct MovieData *a) { printf("title: %s\ndirector: %s\nrelease year: %d\nrunning time: %d", a->title, a->director, a->year, a->runningTime); } int main(void) { // 传递全局变量的地址给函数 movieInfo(&movie); moviePrint(&movie); return 0; }
这样函数就能直接对原始的movie变量进行读写操作,达到和第二段代码一样的效果,同时还能避免过度依赖全局变量。
内容的提问来源于stack exchange,提问作者oreoFlavor
相关产品推荐
相关产品推荐

