C - 结构定义

时间:2014-08-05 15:24:58

标签: c struct

在下面的结构中,为什么firstNamesurname的字符不具有每个字段的字符数量?例如,与[20]类似,它会声明firstName将有20个字符的空间。

struct Student
{
  char * firstName;
  char * surname;
  int studentID;
  int GPA;
 };

5 个答案:

答案 0 :(得分:4)

因为您已将firstNamesurname声明为指针。所以你需要在外部为这些结构成员分配内存。如果不为这些成员分配内存,则无法在其中存储字符串。

这是分配内存的一种方法 -

 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只存储了获取firstNamesurname的位置的内存位置。