在下面的结构中,为什么firstName
和surname
的字符不具有每个字段的字符数量?例如,与[20]
类似,它会声明firstName
将有20个字符的空间。
struct Student
{
char * firstName;
char * surname;
int studentID;
int GPA;
};
答案 0 :(得分:4)
因为您已将firstName
和surname
声明为指针。所以你需要在外部为这些结构成员分配内存。如果不为这些成员分配内存,则无法在其中存储字符串。
这是分配内存的一种方法 -
struct Student
{
char * firstName;
char * surname;
int studentID;
int GPA;
}stu1;
stu1->firstName=(char *)malloc(sizeof(char)*20);
stu1->surname=(char *)malloc(sizeof(char)*20);
另一种分配方式 -
struct Student
{
char * firstName;
char * surname;
int studentID;
int GPA;
};
struct Student *stu1;
stu1=(struct Student *)malloc(sizeof(struct Student));
stu1->firstName=(char *)malloc(sizeof(char)*20);
stu1->surname=(char *)malloc(sizeof(char)*20);
如果你动态分配内存,最后不要忘记free()
!
答案 1 :(得分:1)
Sathish是正确的。为了完整性,另一种方法是在结构中声明一个字符数组。 firstName和surname将分配存储空间。
struct Student
{
char firstName[20];
char surname[20];
int studentID;
int GPA;
} stu1;
strncpy( stu1.firstName, "be_careful_of_really_long_names", 20);
stu1.firstName[19] =0;
printf("%s", stu1.firstName); // 'be_careful_of_reall'
答案 2 :(得分:0)
char * firstname;
char * surname;
是指针。意思是,它们指向某处的内存位置。但是你必须创建/分配你需要的内存。除非为它分配空间,否则它将指向未定义的地址。
以下是一个例子:
Student student;
student.firstName = (char*)malloc(sizeof(char) * 20);
student.surname = (char*)malloc(sizeof(char) * 20);
strcpy_s(student.firstName, 6, "Frank");
strcpy_s(student.surname, 5, "Dill");
printf("first name: %s\n", student.firstName);
printf("sur name: %s", student.surname);
您可以使用strcpy_s将名称复制到缓冲区。添加1个额外长度以考虑空终止字符。当你完成它时,也不要忘记释放你用malloc分配的内存
答案 3 :(得分:0)
*用作指针,因此将指向内存中名为“firstName”的大小为char的位置。但是,它不会将大小设置为20。
答案 4 :(得分:0)
我在回答中提到了malloc
,而@Sathish的回答也是如此。
您还可以使用strcpy
之类的函数将字符串复制到指针。
以下是如何使用它的示例:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct Student
{
char * firstName;
char * surname;
int studentID;
int GPA;
};
int main()
{
struct Student example;
printf("Size of example %d\n", sizeof(example));
strcpy(example.firstName, "James");
printf("The Student's name is: %s", example.firstName);
printf("Size of example %d\n", sizeof(example));
return 0;
}
请注意,结构的大小保持不变,因为您的struct只存储了获取firstName
和surname
的位置的内存位置。