将变量从全局更改为局部 - C

Changing a variable from global to local - C

我已经为一个项目编写了以下代码,但是它未能通过单一测试,要求两个变量不是全局变量,而是 main() 的局部变量。修改 structexample1.c,使变量 studentanotherStudent 不是全局的,而是局部于 main 的。我模糊地理解局部和全局的概念,但我不确定如何在我编写的代码中实现问题的要求。

#include <stdio.h>
#include <stdlib.h>
struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
} student;

struct student_s anotherStudent;

void printOneStudent(struct student_s student)
{
    printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}   

void printStudents(const struct student_s* student)
{
    while (student != NULL) {
        printOneStudent(*student);
        student = student->next;
    }
}

int main(void)
{
    student.name = "Agnes McGurkinshaw";
    student.age = 97;
    student.height = 1.64;
    student.next = &anotherStudent;

    anotherStudent.name = "Jingwu Xiao";
    anotherStudent.age = 21;
    anotherStudent.height = 1.83;
    anotherStudent.next = NULL;

    printStudents(&student);
    return EXIT_SUCCESS;
}

我知道我需要在 main() 中定义这些变量,但我不确定如何以不完全破坏我的代码的方式实现它们。代码的输出应保持如下:

Agnes McGurkinshaw (97), height 1.64 m
Jingwu Xiao (21), height 1.83 m

嗯,先替换这个:

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
} student;

有:

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
};

(即去掉最后一行的student)。

这个更改是必要的,因为你想定义结构类型,以便以后可以定义struct student_s类型的变量,但你不想在这里定义student变量,因为这将使它成为全球性的。

然后删除这一行:

struct student_s anotherStudent;

最后,在使用前在 main() 中声明两个变量:

int main(void)
{
    struct student_s student;
    struct student_s anotherStudent;

    student.name = "Agnes McGurkinshaw";
    student.age = 97;
    student.height = 1.64;
    student.next = &anotherStudent;

    anotherStudent.name = "Jingwu Xiao";
    anotherStudent.age = 21;
    anotherStudent.height = 1.83;
    anotherStudent.next = NULL;

    printStudents(&student);
    return EXIT_SUCCESS;
}

全局变量是在任何函数之外声明的变量,它可以被在变量声明之后定义的任何函数使用:

void f1 () { } // Cannot access a

int a ;

void f2 () { } // Can get and set the value of a

void f3 () { } // Can also get and set the value of a

int main () { // Same as f1 and f2
    f2 () ;
    f3 () ;
    printf("%d\n", a) ; // What is the output?
}

大多数时候,你不想使用全局变量,因为你真的不知道调用各种函数时它们会发生什么(见上面的例子,你不知道 a 的值是否有已被 f2f3) 修改。

局部变量只能在声明它的"scope"处使用:

void f1 () {
    int a ;
}

int main () {
    // a is not accessible here
}

在你的例子中,你声明了两个全局变量,但你没有全局使用它们(因为你在本地声明了同名变量,见下文),所以你应该简单地在你的 main 中本地声明它们:

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
} ; // Not student here

// No declaration here

void printOneStudent(struct student_s student) { /* ... */ }

void printStudents(const struct student_s* student) { /* ... */ }

int main (void) {
    /* Declare student and anotherStudent here */
    struct student_s student, anotherStudent ;
    /* ... */
}

请注意,当您这样做时:

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
} student ;

你在声明类型 struct student_s 的同时声明了变量 student,而如果你在最后删除 student,你仍然在声明 struct student_s 类型,但不再是 student 变量。

在您的代码中,您执行了以下操作:

struct student_s { /* ... */ } student ; // student is a global variable

void printOneStudent (struct student_s student) {
    // Here student correspond to the argument, not to the global variable
}

// Example:
int a = 8 ;

void f (int a) {
    printf("%d\n", a) ;
}

int main (void) {
    f(5) ;
}

输出将是5,而不是8,因为在f中名称a对应于函数的参数,而不是全局变量。

没有太多内容。只需在 main 中声明它们。没有技巧。

// ConsCPP.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
};


void printOneStudent(struct student_s student)
{
    printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}   

void printStudents(const struct student_s* student)
{
    while (student != NULL) {
        printOneStudent(*student);
        student = student->next;
    }
}

int main(void)
{
    struct student_s student;
    struct student_s anotherStudent;

    student.name = "Agnes McGurkinshaw";
    student.age = 97;
    student.height = 1.64;
    student.next = &anotherStudent;

    anotherStudent.name = "Jingwu Xiao";
    anotherStudent.age = 21;
    anotherStudent.height = 1.83;
    anotherStudent.next = NULL;

    printStudents(&student);
    return EXIT_SUCCESS;
}

在文件的顶部有一个 struct student_s {...} student;.

这既定义了一个结构,又分配了其中的一个变量,student

下一行,struct student_s anotherStudent;分配了它的另一个变量。

因为它们不是在函数内部声明的,所以它们是全局的。要使它们成为本地的,必须在函数中声明它们,例如:

int main()
{
    int i;

定义了一个局部整型变量i.

我不会提供代码;这是你的作业,但我希望我已经为你提供了足够的说明。

使用数组:

#include <stdio.h>
#include <stdlib.h>

#define NUM_OF_STUDENTS 2

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;
};


void printOneStudent(struct student_s student)
{
    printf("%s (%d) %s %s %.2lf %s\n", student.name, student.age, ",", "height", student.height, " m");
}

void printStudents(const struct student_s* student)
{
    int i;
    for (i = 0; i < NUM_OF_STUDENTS; i++) {
        printOneStudent(student[i]);
    }
}

int main(void)
{
    struct student_s student[NUM_OF_STUDENTS];
    student[0].name = "Agnes McGurkinshaw";
    student[0].age = 97;
    student[0].height = 1.64;

    student[1].name = "Jingwu Xiao";
    student[1].age = 21;
    student[1].height = 1.83;

    printStudents(student);
    return EXIT_SUCCESS;
}

与你的问题没有直接关系,但无论如何你应该避免这种情况:

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
} student;

struct student_s anotherStudent;

而是这样写:

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
} ;                               // defines the structure

struct student_s student;         // declares variable
struct student_s anotherStudent;  // declares variable

这两种方法实际上是等价的,但是使用第二种方法,您可以清楚地将 struct student_s 的定义与两个变量 studentanotherStudent 的声明分开。这更具可读性。