C 初始化和访问结构中的字符数组

C 初始化和访问结构中的字符数组,c,struct,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

我似乎找不到一种方法来初始化一个结构而不出错。 这是作业

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 );
此块修复了问题,将关闭主题。

您定义了一个指针

char *tmpName;
您没有做任何事情来让它实际指向一些可用的空间,尤其是没有malloc或类似的。 如果成功的话,你就有了scanf。。。写入指针,但写入字符串,而不是任何有意义的地址。也就是说,如果这个字符串不是很短,那么你肯定会写得更远

scanf("%s",&tmpName);
不要对故障感到惊讶,如果没有故障,请感到惊讶。 稍后你们会读到那个奇怪的非指针指向

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

剩下的是一组典型的问题,如空间不够、扫描失败、未检查返回值等。下面是一组关于正确输入的基本提示:

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

当编译器听到这个消息时,他很可能会用大量静态字符成员替换字符串

#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;
尽管您仍然需要使用语法名[index]来访问这些对象,但在声明数组时,实际上找不到数组指针。所以你不能直接分配它

这是任何固定长度数组的基本情况,它们不允许您对它们进行分配,因为它们的内容直接存储在堆栈中或包含它的数据结构中

你需要申报

typedef struct{
    char *name;
    int id;
}student;
获取可分配的可变长度的字符数组指针

这应该可以回答您的问题,现在,正如您的评论部分中有人所说,您的代码中还有其他错误,即使结构正确,您也可能无法完成您想要的操作,因为scanf可能正在返回arror。^^

尝试预先分配内存,执行以下操作:

char *yourstring = (char*)malloc(MAXSTRING * sizeof(char));
当然,当您不需要字符串或学生结构时,不要忘记释放:

free(yourstring);
另外,由于您执行了以下操作,您的任务还有一个小问题:

.name=*yourstring

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

假设char*yourstring=我喜欢猫。; Doing.name=*您的字符串将导致.name等于'I'字符,它是字符串指向的数组中的第一个字符。大多数编译器都会抱怨并要求您强制转换。。不要那样做

因此,您真正需要做的是将指针指定给.name数组指针


.name=yourstring

您认为scanf应该在哪里写入?你的意思是像char*tmpName=malloc sizeofchar这样的东西。很抱歉,我不能把注意力集中在内存分配上。我在我的答案中添加了一个编辑来处理这一部分。@Makismanderlas你显然不是这么新来的。这里没有主题。问题不会被编辑为包含有关您的解决方案的信息。问题就是问题,答案就是答案。没有“主题”这样的东西。你的答案中有很多无意义的东西;字符名称1;…:没有意义,所以把它去掉。不要抛出malloc的结果;char name[]错误,并且.name=*您的字符串;会让编译器抱怨。最好删除您的答案。在回答此类问题之前,请先了解指针、数组和结构。你不仅混淆了指针和数组的不同之处,还声明了许多错误的响应。可疑的索赔。另外,建议无效声明,等等。如果你是这样学的,那就拿回课程的学费,或者停止尝试从晦涩难懂的youtube视频或在线视频中学习。顺便说一句:编辑并没有让它变得更好。啊,你对字符名[]的看法是对的,不知道我是从哪种语言中选的。不过我在旁边加了另一个版本,说他应该用char*这个名字,所以我觉得你有点苛刻。name=*您的字符串不会编译,但我已经在代码旁边说过了。。我不同意你大部分的责备cOlaf:我通常将数组称为数组指针,我认为这是初学者最容易理解的方法,同时也要记住,有一个指针可以解决这个问题。虽然数组不是指针,但数组大量使用指针。然后,再重复一次,带有inv的零件
alid分配是从他的代码中复制/粘贴的,后面跟着这个将不会编译。我认为你没有阅读答案是不公平的。我使用malloc+fgets来阅读输入。但问题依然存在