创建数组时的分配问题

问题描述 投票:0回答:1

我想邀请2个人加入这个俱乐部,所以有一个教父这样做,他必须邀请这2个人,但是第一个有优先邀请另外2个人的机会,然后第二个有机会这样做。但我不知道为什么它正在阅读第一个,但当我尝试邀请第二个时,程序停止了。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

typedef struct people{
    char name[40];
    int id;
    struct people *pgodFather;
    struct people *pfirst;
    struct people *psecond;
}People;

int id = 0; // Percorrer os arrays
bool accepted;

People *peopleList; // Apontar para o primeiro
int initialSize = 10;
People **arrayPeople;

void verificationSize(){
    if(id >= initialSize){
        initialSize *= 2;
        arrayPeople = realloc(arrayPeople, initialSize * sizeof(People));
    }
}

bool verificationId(){
    int ids;

    printf("Type your ID: ");
    scanf("%d", &ids);

    if(ids == ((2*(id-1)) + 1) || ((2*(id-1)) + 2)){
        return true;
    } else{
        printf("NO PRIORITY\n");
        return false;
    }
}

void invite(){
    system("cls");
    verificationSize();
    People *p = (People*)malloc(sizeof(People));

    if(id == 0){
        p->id = 0;
        accepted = true;
    }else if(id > 0){
        accepted = verificationId();
    } else{
        printf("ID ERROR\n");
        accepted = false;
    }

    if(accepted == true){
        // arrayPeople[id] = p;
        printf("Type your name: ");
        scanf("%s", p->name);
        p->pgodFather = peopleList; // null, [0], [1],
        peopleList = p; // [0], [1], [2]

        printf("Invite the first one: ");
        scanf("%s", arrayPeople[(2*id) + 1]->name);
        printf(arrayPeople[(2*id) + 1]->name);
        p->pfirst = arrayPeople[(2*id) + 1];

        char name[40];
        printf("Invite the second one: ");
        scanf("%s", arrayPeople[(id*2)+2]->name);
        p->psecond = arrayPeople[(id*2) + 2]; // PROBLEMA
        printf(arrayPeople[(2*id) + 2]->name);
        
        id++;
    }
}

int main(void){
    arrayPeople = (People**) malloc(initialSize * sizeof(People*));
    int choice;
    bool stop = false;

    while(!stop){
        printf("CROWS CLUB\n");
        printf(" 1 - Invite\n");
        printf(" 2 - Search\n");
        printf(" 3 - Display\n");
        printf(" 4 - Delete\n");
        printf(" 5 - Exit\n");

        printf("Choose the alternative: ");
        scanf("%d", &choice);

        switch(choice){
            case 1:
                invite();
            break;

            case 2:
               // search();
            break;
            
            case 3:
                // display();
            break;

            case 4:
               // delete();
            break;

            case 5:
                stop = true;
            break;

            default:
                printf("Invalid Option");
            break;
        }
    }
    return 0;
}

// for(int f = 0; f < initialSize; f++){
//     free(arrayPeople[f]);
// }

// free(arrayPeople);

我想邀请遵循这个规则的人,我必须在这个数组中进行

c malloc
1个回答
2
投票

您只分配了数组

arrayPeople
,并没有初始化其元素。
因此,像
arrayPeople[(2*id) + 1]
这样的元素具有 不确定的值,并且使用这些值(例如像
arrayPeople[(2*id) + 1]->name
那样取消引用)会调用 未定义的行为
当调用未定义行为时,任何事情都可能发生。您的程序可能会也可能不会因未定义的行为而崩溃。

在取消引用之前分配内存并分配给元素。

示例(为简单起见,省略了错误检查):


        printf("Invite the first one: ");
        arrayPeople[(2*id) + 1] = malloc(sizeof(**arrayPeople)); // allocate memory
        scanf("%39s", arrayPeople[(2*id) + 1]->name);
        fputs(arrayPeople[(2*id) + 1]->name, stdout);
        p->pfirst = arrayPeople[(2*id) + 1];

        char name[40];
        printf("Invite the second one: ");
        arrayPeople[(id*2)+2] = malloc(sizeof(**arrayPeople)); // allocate memory
        scanf("%39s", arrayPeople[(id*2)+2]->name);
        p->psecond = arrayPeople[(id*2) + 2]; // PROBLEMA
        fputs(arrayPeople[(2*id) + 2]->name, stdout);

另请注意:

  • malloc()
    家庭的选角结果被视为不好的做法
  • 将用户输入字符串传递给
    printf
    的第一个参数是危险的,因为输入可能包含用于格式化的
    %
    。您应该使用
    printf(something)
    fputs(something, stdout)
    ,而不是
    printf("%s", something)
  • %s
    scanf
    一起使用是危险的,因为它可能会读取无限长度的输入,并可能导致缓冲区溢出。您应该指定读取的最大长度,如
    %39s
    。最大长度必须小于缓冲区大小。 (缓冲区大小太长而无法指定,因为没有为终止空字符分配空间)
  • 函数
    verificationSize
    中的分配是错误的。数组
    arrayPeople
    的元素为
    People*
    ,因此分配大小应为
    initialSize * sizeof(People*)
    initialSize * sizeof(*arrayPeople)
    ,而不是
    initialSize * sizeof(People)
  • 函数
    ids == ((2*(id-1)) + 1) || ((2*(id-1)) + 2)
    中的条件
    verificationId
    对于所有小到不会导致溢出的正
    id
    始终为真,因为
    ((2*(id-1)) + 2)
    始终为正。您可能想使用
    ids == ((2*(id-1)) + 1) || ids == ((2*(id-1)) + 2)
    来代替。
© www.soinside.com 2019 - 2024. All rights reserved.