在struct中初始化和访问char数组

时间:2018-04-22 14:09:45

标签: c struct

我似乎无法找到一种初始化结构而不会出现分段错误的方法。 这是作业“

int id = 5;
// scanf ("%10d", &id);
printf("Please give an name\n");
char *tmpName = (char*)malloc(MAXSTRING * sizeof(char));
fgets(tmpName,MAXSTRING,stdin);
student newStudent = (student){ .id = id , .name = tmpName };
printf("%d",newStudent.id);
printf("%s",newStudent.name);

` 这是结构本身

#define MAXSTRING  256
typedef struct{
    char *name;
    int id;
}student;

我可以成功初始化结构,但我无法访问name变量,有什么想法吗?

编辑:当时提交的答案什么也没提,问题是结构初始化的方式

char tmpName[MAXSTRING] =  {0};
scanf("%s",tmpName);
student newStudent = { .id = id };
strcpy(newStudent.name,tmpName );

此块修复了该问题,将关闭该主题。

2 个答案:

答案 0 :(得分:0)

您定义指针

char *tmpName;

你没有做任何让它实际指向某个可用空间的东西,特别是没有malloc()或类似的东西。
您有scanf()(如果成功...)写入指针,但是一个字符串,而不是任何有意义的地址。即如果那个字符串不是很短,你肯定会写出来。

scanf("%s",&tmpName);

不要对段错误感到惊讶,如果没有段落就会感到惊讶 稍后你会从那个奇怪的非指针指向...的位置读取...

要解决,请在指针定义后插入malloc()。或者使用char的固定数组作为输入缓冲区 在scanf()中使用指针本身而不是其地址将字符串写入malloced空间。 (或数组标识符。)

其余的是一组典型的问题,即有足够的空间,无法扫描,没有检查返回值等。这里有一组很好的基本提示,可以正确输入:
How to read / parse input in C? The FAQ

答案 1 :(得分:-2)

当您声明char name[MAXSTRING]时,您告诉编译器它将始终具有MAXSTRING的确切长度。

当编译器听到这一点时,他很可能会用很多静态char成员替换你的字符串。

#define MAXSTRING  4
typedef struct{
    char name[MAXSTRING];
    int id;
}student;

将更加扩展和编译:

#define MAXSTRING  4
typedef struct{
    char name0;
    char name1;
    char name2;
    char name3;
    int id;
}student;

虽然你仍然需要使用语法name[index]访问那些,但是当你声明一个数组时,实际上找不到数组指针。所以你不能直接分配它。

这基本上是任何固定长度数组所发生的事情,因为它们的内容直接存储在堆栈中或包含它的数据结构中,所以它们不允许您对它们进行标记。

您需要申报。

typedef struct{
    char *name;
    int id;
}student;

获取可以指定的可变长度的char数组指针。

这应该回答你的问题,现在,正如评论部分中的某些人所说,你的代码中还有其他问题,即使是正确的结构,你可能无法做你想做的事情,因为scanf可能正在返回现在是一个恐怖。 ^^'

尝试事先分配内存:

char *yourstring = (char*)malloc(MAXSTRING * sizeof(char));

当然,当你不需要字符串或学生结构时,不要忘记自由:

free(yourstring);

然后再说一遍,因为你做了类似这样的事情,你的同意又出现了一个小问题:

.name = *yourstring

使用指针时,在前面添加*将访问指向地址的值。

假设char *yourstring = "I love cats.";
执行.name = *yourstring将导致.name等于'I'字符,这是yourstring指向的数组中的第一个字符。 (大多数编译器会抱怨并要求你施放..不要这样做。)

所以你真正需要做的是将指针分配给.name数组指针。

.name = yourstring