在malloc()中使用switch / case

时间:2018-12-11 21:06:06

标签: c string switch-statement malloc

我正在尝试编写代码以将患者添加到列表中。这是一个很大的代码,但是我在输入患者姓名的特定部分上遇到了问题。我可以正确输入名称,但是当我尝试将代码放入交换机/机箱中时,它便无法正常工作。我想知道这里有人可以帮忙吗?

最初,我认为可能是malloc导致了此问题,但如果不使用switch / case,它似乎可以正常工作。

代码:

#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 you\n");
        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 %d\nname:%s" ,count,ptr->name);
        ptr = ptr->next;
        count++;
    }
    printf("\n---------------------");
    printf("\n");
}

2 个答案:

答案 0 :(得分:2)

   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的返回。

答案 1 :(得分:2)

尽管您的建筑...

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

...从技术上讲是合法的,它无法实现您想要的。它确实声明了变量name,该变量位于switch主体的整个范围内,但是执行总是跳到casedefault标签是否完全进入主体,因此将永远不会评估初始化程序(包含malloc()的调用),也不会为变量name分配初始值。

实际操作方式取决于您要完成的工作。如果只希望在一个name中使用变量case,则在此处声明和初始化它可能更有意义,但是您不能在标签后立即这样做。您可以将其放在自己的块中,也可以在它们之间放置可执行语句,

   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));
       // ...

但是,我建议您不要选择这种方法,因为它的风格很差。