Реаллок в структуру в с - PullRequest
       1

Реаллок в структуру в с

0 голосов
/ 14 января 2019

у меня проблема с моим realloc в порядке добавления func каждый раз, когда происходит сбой кто-то может помочь мне здесь

typedef struct
{
    char carname[30]; //car names
    int price; //the price of the car

}Vehicle;


typedef struct {
    int number;     // מספר הזמנה
    char *name;     // שם המזמין
    char ID[10];        // מספר זהות שלו
    int number_vehicles; // מספר הרכבים בהזמנה
    Vehicle * list;
    int sum_order;
}Order;



Order * add_orders(Order * firma, int * ordersize)// adding one more order
{

    int i, j;
    char temp[80];
    int newstart; // because we need to add one more order we need new start and it will be the old size of the number of orders
    newstart = *ordersize; //we just did it
    (*ordersize)++; // now we have new size +1 for the one more order

    for (i = newstart; i < *ordersize; i++) //same as the input function but this one start and finish from the new start and finish
    {
        printf("enter the ID of order number: %d\n", i + 1);
        scanf("%d", &firma[i].number);
        while (getchar() != '\n');

        printf("enter the name of the client:\n");
        gets(temp);
        firma[i].name = (char*)malloc(strlen(temp) + 1 * sizeof(char));
        if (!firma[i].name)
        {
            printf("error\n");
            return 0;
        }
        strcpy(firma[i].name, temp);

        printf("enter the ID of client (length can only be 10):\n");
        gets(firma[i].ID);

        printf("enter how many vehicles you want in this order\n");
        scanf("%d", &firma[i].number_vehicles);
        firma[i].list = (Vehicle*)malloc(firma[i].number_vehicles * sizeof(Vehicle));

        if (!firma[i].list)
        {
            printf("error\n");
            return 0;
        }


        for (j = 0; j < firma[i].number_vehicles; j++)
        {
            while (getchar() != '\n');
            printf("enter the name of the vehicle number %d (only 30 chars):\n", j + 1);
            gets(firma[i].list[j].carname);
            printf("enter the price of the vehicle\n");
            scanf("%d", &firma[i].list[j].price);


        }

    }


    firma = (Order*)realloc(firma, (*ordersize * sizeof(Order))); //after we added the new order we do realloce for the new size for the struct
    if (!firma)//if failed
    {
        printf("error\n");
        return 0;
    }


}



int main()
{
    int i, j;
    char temp[80];
    char *str = NULL;
    int num, x, y;
    int number;
    int ordersize;
    int exit1 = 0;
    int exit2 = 0;
    int exit3 = 0;
    int flag = 0;
    int choose;
    Order *data = NULL; //pointer to the struct Order

printf("\nenter how many orders you want\n");
scanf("%d", &ordersize); //enter size of orders
data = (Order*)malloc(ordersize * sizeof(Order));//we allocte memory for the struct Order with pointer data

add_orders(data, &ordersize); //send it

return 0;
}

У меня проблема с моим перераспределением в порядке добавления функций каждый раз, когда происходит сбой кто-то может помочь мне здесь

У меня проблема с моим перераспределением в порядке добавления функций каждый раз, когда происходит сбой кто-то может помочь мне здесь

у меня проблема с моим перераспределением в порядке добавления функций каждый раз при сбое кто-то может помочь мне здесь

1 Ответ

0 голосов
/ 14 января 2019

Вы получаете доступ вне границы для firma.

data = (Order*)malloc(ordersize * sizeof(Order));//we allocte memory for the struct Order with pointer data

add_orders(data, &ordersize); //send it

Когда вы выделите память размером orderSize и получите доступ к firma[newstart].

newstart = *ordersize; //we just did it
(*ordersize)++; // now we have new size +1 for the one more order

for (i = newstart; i < *ordersize; i++) //same as the input function but this one start and finish from the new start and finish
{
    printf("enter the ID of order number: %d\n", i + 1);
    scanf("%d", &firma[i].number);
    while (getchar() != '\n');

    .....
 }

Таким образом, сначала выделите больше памяти и доступа.

   newstart = *ordersize; //we just did it
   (*ordersize)++; // now we have new size +1 for the one more order

    firma = (Order*)realloc(firma, (*ordersize * sizeof(Order))); //after we added the new order we do realloce for the new size for the struct
    if (!firma)//if failed
    {
        printf("error\n");
        return 0;
    }

   for (i = newstart; i < *ordersize; i++) //same as the input function but this one start and finish from the new start and finish
   {
       printf("enter the ID of order number: %d\n", i + 1);
       scanf("%d", &firma[i].number);
        while (getchar() != '\n');

       .....
   }

Примечание :: firma - локальная переменная, выделяющая память с использованием realloc в addOrder функция не влияет на переменную data в main функция. Вам может понадобиться передать data, используя ссылку или возврат обновите значение из функции и присвойте его data.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...