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

为何第一段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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:47:41