c-将switch/case与malloc()一起使用



我正在尝试编写一个代码,将患者添加到列表中。这是一个很大的代码,但我在输入患者姓名的特定部分遇到了问题。我可以正确地输入名称,但当我试图将代码放入开关/机箱时,它停止了正常工作。我想知道这里是否有人能帮忙。

起初我认为可能是malloc造成了这个问题,但如果没有开关/案例,它似乎可以正常工作。

代码:

#include <stdio.h>
#include <stdlib.h>
typedef unsigned long int u32;
typedef unsigned char u8;
typedef struct Patient patient;
struct Patient
{
u8* name;
patient* next;
};
void addfirstpatient(u8* name);
void addpatient(u8* name);
void print (void);
patient* head;
u8 length = 0;
int main()
{
u32 x = 1;
switch(x)
{
u8* name = malloc(20*sizeof(u8));
case 1:
printf("nPlease enter patient name:");
scanf("%s",name);
if(length == 0)
{
addfirstpatient(name);
}
else
{
addpatient(name);
}
print();
printf("nPatient added , Thank youn");
printf("nTo add another patient press 1");
scanf("%d",&x);
break;
case 2:
break;
default:
printf("nentered default");
}
return 0;
}
void addfirstpatient(u8* name)
{
printf("nadding first patient: ");
head = (patient*)malloc(sizeof(patient));
head->next = NULL;
head->name = name;
length++;
}
void addpatient(u8* name)
{
patient* ptr = head;
while((ptr->next)!=NULL)
{
ptr = ptr->next;
}
printf("nadding patient");
ptr->next = (patient*)malloc(sizeof(patient));
(ptr->next)->next = NULL;
(ptr->next)->name = name;
length++;
}
void print (void)
{
patient *ptr = head;
u32 count = 1;
printf("n---------------------");
if (ptr == NULL)
{
printf ("nList is empty");
}
while (ptr!=NULL)
{
printf("npatient Number %dnname:%s" ,count,ptr->name);
ptr = ptr->next;
count++;
}
printf("n---------------------");
printf("n");
}
switch(x)
{
u8* name = malloc(20*sizeof(u8));
case 1:

这是不合法的-令人惊讶的是它编译了(也许它没有,也许这是你的错误(。你需要

u8* name = malloc(20*sizeof(u8));
switch(x)
{
case 1:

或者

u8* name = NULL;
switch(x)
{
case 1:
name = malloc(20*sizeof(u8));

取决于您希望该阵列何时分配

当然,您应该检查malloc的返回。

尽管像您的。。。

switch(x)
{
u8* name = malloc(20*sizeof(u8));
case 1:

。。。从技术上讲是合法的,它没有达到你想要的目的。它确实声明了变量name,然后它在整个switch的主体中的作用域中,但如果它进入主体,则执行总是跳到casedefault标签,因此初始化器(包含malloc()调用(永远不会求值,也永远不会将初始值分配给变量name

你应该如何实际进行取决于你想要完成什么。如果您只想在一个case中声明变量name,那么在那里声明和初始化它可能更有意义,但不能在标签后立即声明和初始化。您可以将它封装在自己的块中,也可以在两者之间放置一条可执行语句:

switch(x) {
case 1: {
u8* name = malloc(20*sizeof(u8));
// ...
}
// ...

如果您希望它用于多个case,那么最好在switch:之外声明它

u8* name = malloc(20*sizeof(u8));
switch(x) {
case 1:
// ...

如果您将声明保留在原地,那么在使用它之前,必须小心为它分配一个值,适当的case标签之后:

switch(x) {
u8* name;
case 1:
name = malloc(20*sizeof(u8));
// ...

然而,我敦促你不要选择这种方法,因为这是一种糟糕的风格。

相关内容

  • 没有找到相关文章

最新更新