我正在用c编写一个简单的程序,所以我可以更好地理解语言,但我有一个奇怪的问题。 从下面的代码中可以看出,当我将255作为值插入时,我只有一个循环退出。问题是,当我选择第一个(插入选项)并且在我插入名称之后,程序启动类似于循环的东西并且一直给我选择屏幕......
#include<stdio.h>
#include<stdlib.h>
struct student{
char *name;
int id;
};
void insertStudent(void);
struct student * init(void);
int main(){
struct student *p;
int selectionCode=0;
while(selectionCode!=255){
printf("\nInsert students:1");
printf("\nDisplay students:2");
printf("\nExit:255");
printf("\n\nEnter selection:");
scanf("%d",&selectionCode);
p=init();
switch(selectionCode){
case 1:
insertStudent();
//printf("1\n");
break;
case 2:
//printf("2\n");
break;
case 255:
break;
}
}
//p->name="stelios";
//p->id=0;
//printf("Name:%s ID:%d",p->name,p->id);
//free(p);
//p=NULL;
return 0;
}
struct student *init(void)
{
struct student *p;
p=(struct student *)malloc(sizeof(struct student));
return p;
}
void insertStudent(void){
struct student *p;
p=init();
printf("Enter Name:");
scanf("%s",p->name);//return 1;
printf("Enter ID:");
scanf("%d",&p->id);
//printf("test");
}
答案 0 :(得分:2)
部分问题可能是代码没有为结构中的name
字段分配内存。 init
函数分配新结构,但不初始化name
字段。 insertStudent
函数然后使用scanf
读取未初始化的指针。这导致写入“随机”内存,并可能导致任何数量的问题,包括访问冲突。
答案 1 :(得分:0)
看起来你有内存泄漏,我会把p传递给insertStudent()。
您在insertStudent()调用的中间也有一个return 1;
,因此它将在完成其工作之前返回。
答案 2 :(得分:0)
您需要删除“返回1;”来自insertStudent,否则将无法编译。
您应该使用malloc初始化p-&gt;名称并更改“scanf(”%s“,p-&gt; name);” to“scanf(”%s“,&amp; p-&gt; name);”,因为你需要一个指向* char的指针。
答案 3 :(得分:0)
你有“返回1”;扫描名称后。看起来逻辑上你不应该在那时返回,因为你想输入ID。此外,您将该函数声明为返回“void”,因此返回一个是错误。
编辑:真正的问题是你从未为名称字符串分配空间。
答案 4 :(得分:0)
尝试:
struct student *insertStudent(void){
struct student *p;
p=init();
printf("Enter Name:");
scanf("%s",p->name);
printf("Enter ID:");
scanf("%d",&p->id);
//printf("test");
return p;
}
主要
case 1:
free(p);
p=insertStudent();
//printf("1\n");
在init上,您必须为名称分配空间。
答案 5 :(得分:0)
多么糟糕...... :-) 你永远不会将malloc()作为p-&gt; name的缓冲区,但是如果使用scanf()则填充。 这破坏了程序的记忆。 此外...在您的函数中,您也使用变量p和主程序。 这不是相同的变量,但你似乎认为它是。 另一个问题:退货1; scanf()中止insertStudent()函数后,从不执行“输入ID”。 它是一个void函数,所以它不应该返回一个值。编译器可能已发出警告。
它可能有更多错误,但这是我在快速给它一次后发现的。