struct employee {
int employeeId;
double payrate;
char *inputname;
};
int main (void){
//remember the struct before employee
struct employee davidB;
fgets(davidB.inputname, 20, stdin);
davidB.employeeId = 1;
davidB.payrate = 45020.50;
printf("The employees name is %s\n The employees id num is %d\n The employees payrate is %f\n", davidB.inputname, davidB.employeeId, davidB.payrate);
struct employee ericG;
printf("Please enter employee name, id number, and payrate\n");
scanf("%s", ericG.inputname);
scanf("%d", &ericG.employeeId);
scanf("%lf", &ericG.payrate);
printf("The employees name is %s\n The employees id num is %d\n The employees payrate is %f\n", ericG.inputname, ericG.employeeId, ericG.payrate);
return 0;
}
我的问题涉及:
fgets(davidB.inputname, 20, stdin);
scanf("%s", ericG.inputname);
为什么第一个工作以及为什么第二个会导致堆栈溢出?此外,什么时候可以直接为指针指定“字符串”,何时需要预先定义的字符数组?
例如:
const char *string = "Hey"; //works? so can't I do the same with the scanf above?
答案 0 :(得分:1)
你需要分配内存才能使用这些函数,否则你会得到堆栈溢出,因为这个指针(davidB.inputname
)指向垃圾。
一个选项是将其定义为char inputname[21];
,但这只适用于fgets
函数,因为您可以限制读取的字符数。
但是对于scanf
,你无能为力,除非你可以100%读取你将要阅读的字符串的大小,所以最好不要这样做。
答案 1 :(得分:1)
您尚未为`inputname
分配内存。所以两者都调用未定义的行为。所以两者都不起作用,不管怎样都不合法。
但是当你直接分配时:
const char *string = "Hey";
string
仅指向字符串文字。所以那里不需要内存分配。
因此,您可以直接分配给struct
成员:
struct employee davidB;
davidB.inputname = "Eric"; // Thiis is valid.
davidB.employeeId = 1;
davidB.payrate = 45020.50;
否则,您必须为inputname
动态分配内存:
struct employee davidB;
davidB.inputname = malloc(256);
fgets(davidB.inputname, 256, stdin);
davidB.employeeId = 1;
davidB.payrate = 45020.50;
答案 2 :(得分:1)
只是随机运气,单向运行,但另一种运行没有。两种方法都不正确,因为您没有为inputname分配任何内存以指向。因此,这些功能只是将数据输入到某个随机存储器位置。
const char * string =“Hey”有效,因为这是静态数据,编译器正在为它分配空间。