我似乎无法找到一种初始化结构而不会出现分段错误的方法。 这是作业“
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 );
此块修复了该问题,将关闭该主题。
答案 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