无法通过函数(C)将项目添加到数组中

时间:2018-10-13 08:07:20

标签: c function pointers crash scanf

所以我对编程还很陌生,有时候我会很乱,所以请多多包涵。

我试图创建一个处理两个不同数组的程序,并且试图创建一个向其中一个添加项目的函数,但是我遇到了麻烦,该程序的运行方式类似于:

#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 :(得分:1)

您只是不为“队列”元素分配任何内存。

insert(queue1,&i,&value);

ivalue作为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);
    }
}