我已经写了一个项目,下面的代码但它失败奇异的测试要求两个变量不是全局的,而是是本地的main()
修改structexample1.c
使变量student
和anotherStudent
不是全局性的,但是是局部的主。 我隐约了解当地和全球的概念,但我不能确定如何实现什么的问题是问到我写的代码。
#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
Answer 1:
好了,先更换此:
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;
}
Answer 2:
不直接关系到你的问题,但无论如何,你应该避免这种情况:
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
从两个变量的声明student
和anotherStudent
。 这是更具可读性。
Answer 3:
全局变量是所声明之外的任何功能且可以由变量声明之后定义的任何功能一起使用的变量:
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?
}
在大多数情况下,你不希望使用全局变量,因为你真的不知道发生了什么他们调用各种功能时(见上面,你不知道的价值已经被修改的例子f2
或f3
)。
局部变量只能在其已申报的“范围”中:
void f1 () {
int a ;
}
int main () {
// a is not accessible here
}
在你的情况,你都声明了两个全局变量,但你不全局使用它们(因为你声明的变量具有相同名称的本地,见下文),所以你应该只是里面的主本地声明它们:
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 ;
你declarting型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
对应于该函数的参数,而不是全局变量。
Answer 4:
没有多少吧。 刚刚宣布他们的主。 有没有技巧。
// 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;
}
Answer 5:
在文件的顶部,你有一个struct student_s {...} student;
。
这两种定义的结构,分配它的一个变量, student
。
下一行, struct student_s anotherStudent;
分配的它的另一个变量。
因为他们不是一个函数内声明的,而是全球性的。 为了让他们的地方,他们必须在函数声明,例如:
int main()
{
int i;
它定义了一个本地整数变量i
。
我不会提供代码; 它是你的功课,但我希望我给了足够的澄清你。
Answer 6:
使用数组:
#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;
}
文章来源: Changing a variable from global to local - C