C中的循环问题

时间:2011-05-03 13:58:08

标签: c loops struct

我正在用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");
    }

6 个答案:

答案 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函数,所以它不应该返回一个值。编译器可能已发出警告。

它可能有更多错误,但这是我在快速给它一次后发现的。