Возникли проблемы при добавлении элемента в массив через функцию (C) - PullRequest
0 голосов
/ 13 октября 2018

Так что я довольно новичок в программировании, и иногда я в некотором беспорядке, поэтому терпите меня, пожалуйста.

Я пытаюсь создать программу, которая обрабатывает два разных массива, и я пыталсясделать функцию, которая добавляет элемент к любому из них, однако у меня возникли некоторые проблемы, программа выглядит примерно так:

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

void insert(int **queue, int *cont, int *item); //the idea is to 
   // call the array i want to add the item to, 
   // the counter for that respective array, and the scanned 
   // item to be added

void instructions();

int main(int argc, char *argv[]) {
    int i=0, j=0;                       //counters for each array
    int value;                          //scanned value to insert
    int op;
    int *queue1[10], *queue2[10];       //the arrays i'm going to use
    while (op!=0){
        instructions();
        scanf("%d", &op);
        switch(op) {
        case 1:
            printf("You've chosen to enqueue an item, please insert the item you want to add to the array:\n" );
            scanf("%d", &value);
            insert(queue1,&i,&value); //here's the case for adding 
               // an item to array one, i called the array, its 
               //counter and the value i want to insert
            break;
        default :
            if (op!=0)
            printf("Invalid Option.\n" );
        }
    }
    return 0;
}

void insert(int **queue, int *count, int *item){
    if(*count==9){
        printf("You can't add more items.");
        }else{
        *queue[*count]=item;
        *count=(*count+1);
    }
}

void instructions(){
    printf("What function do you want to use?\n1)Insert Queue 1.\n2)Remove Queue 1.\n3)Print Queue 1.\n4)Insert Queue 2.\n5)Remove Queue 2.\n6)Insert Queue 2.\n0)Exit.\n");
}

Как видите, программа представляет собой беспорядок указателей и прочего,Я искал повсюду, я читал страницы и страницы о функциях, но нигде не мог найти то, что помогло бы мне с тем, что я хочу, после применения того, что, как я думал, я узнал, это тот беспорядок, с которым я закончил.Кажется, что счетчик работает нормально и увеличивается каждый раз, когда используется функция, что я и хотел, однако, когда я попытался поставить printf("%d\n", queue1[0]); после функции инструкция, чтобы показать мне, действительно ли значение было вставлено в массив, он показал некоторыедовольно странное число, которое даже не выглядит как адрес для меня, и в довершение всего, после использования функции примерно 3 раз, чтобы "добавить" случайные числа в массив, программа просто вылетает.

Так что, если кто-то может мне помочь, полный новичок, поймите, что я делаю не так, чтобы я мог исправить этот беспорядок, я был бы очень признателен.

1 Ответ

0 голосов
/ 13 октября 2018

Вы просто не выделяете память для элементов «очереди».

insert(queue1,&i,&value);

Если i и value являются локальными переменными типа int, вы снова будете использовать ту же ячейку памятии снова при заполнении указателей в вашем массиве.

void insert(int **queue, int *count, int *item){
    if(*count==9){
        printf("You can't add more items.");
    }else{
        *queue[*count]=item;
        *count=(*count+1);
    }
}

В этой функции вы получаете адреса локальных переменных от вызывающей стороны.

Когда вы присваиваете item элементуваш массив, он будет указывать на value из функции вызывающего.И вы должны заполнить каждый элемент массива тем же адресом.

Другая проблема:

queue1 не инициализируется и содержит 10 случайных адресов.

*queue[*count]=item;

Здесь вы разыменовываете те адреса, которые вызывают сбой.

Вам необходимо выделить память для каждого нового элемента.

int *queue1[10];
...
insert(queue1, &i, value);
...
void insert(int **arr, int *count, int value){
    if(*count==9){
        printf("You can't add more items.");
    }else{
        int *item = malloc(sizeof(*item));
        if (item != NULL)
        {
            *item = value;
            arr[*count]=item;
            *count=(*count+1);
        }
        else
        {
            printf("memory allocation error\n");
        }
    }
}

Или ...

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

int queue1[10];
...
insert(queue1, &i, value);
...
void insert(int *arr, int *count, int item){
    if(*count==9){
        printf("You can't add more items.");
    }else{
        arr[*count]=item;
        *count=(*count+1);
    }
}
...