2011-05-03 80 views
3

我正在用c写一个简单的程序,所以我可以更好地理解语言,但是我有一个奇怪的问题。 正如你从下面的代码中看到的,我只有一个循环,当我插入255作为一个值时它退出。问题是,当我选择第一(插入选项)后,我插入一个名字在节目开始像一个循环,并给了我所有的时间选择画面......C中的循环问题

#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

是的,这将是。但是你不想每次都选择屏幕? – 2011-05-03 14:05:29

+0

@Doug T.Nope它不是作业。我知道Java,现在我正在学习C ... – Stelios 2011-05-03 14:10:32

回答

2

部分问题可能是该代码没有为该结构中的name字段分配内存。 init函数分配一个新的结构,但不会初始化name字段。然后insertStudent函数使用scanf来读入该未初始化的指针。这会导致写入“随机”内存,并可能导致任何数量的问题,包括访问冲突。

+0

你是对的,我改变指针到数组(名称[30]),它的工作。但是,如果我想使用指针,我怎么能分配结构内的内存? – Stelios 2011-05-03 14:44:59

+0

@Stelios:要使用指针,您需要在分配结构本身之后再次调用malloc。'p-> name = malloc(30);'。如果您坚持使用固定大小,则使用该数组可能更简单/更好(名称[30])。但是,如果您稍后想要更改大小,那么使用malloc就可以实现(然后可以释放并再次使用malloc或使用realloc)。 – 2011-05-03 15:27:24

0

看起来你有一个内存泄漏,我将p传入insertStudent()。

在insertStudent()调用中间还有一个return 1;,所以在完成工作之前它会返回。

0

您需要删除“return 1;”来自insertStudent,否则就不会编译。你应该用malloc初始化p-> name,并改变“scanf(”%s“,p-> name);”到“scanf(”%s“,& p-> name);”,因为你需要一个指向* char的指针。

+0

你是对的回报只是我忘了评论它。 &p->名称不正确,因为如果我想使用&我应该有这种形式&* p->名称。我已经运行它,以防万一,我是对的。 – Stelios 2011-05-03 14:24:19

+0

是的,你是正确的与scanf。 – 2011-05-03 18:37:22

0

你有“返回1;”扫描完名后。从逻辑上看,你不应该在这一点上返回,因为你想输入ID。此外,你声明该函数返回“无效”,所以返回一个是错误。

编辑:真正的问题是,您从来没有为名称字符串分配空间。

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"); 

在您需要的名称分配空间初始化。

+0

我出现了分段错误,可能是因为p没有初始化。即使初始化它也循环..在初始化函数 – Stelios 2011-05-03 14:18:29

+0

你如何分配内存的名称? – Iraklis 2011-05-03 14:24:15

0

什么是混乱...... :-) 你从来没有malloc()为p->名称的缓冲区,但是如果使用scanf()填充。 这会破坏程序的内存。 此外......在你的函数中,你也使用变量p和主程序。 这不是同一个变量,但你似乎认为它是。 另一个问题:返回1;在scanf()中止insertStudent()函数之后,“输入ID”从不执行。 这是一个无效函数,所以它不应该返回一个值,顺便说一下。编译器可能已经发出警告。

它可能有更多的错误,但这是我发现之后立即给它一次。