C中带有伪泛型的C双指针重新分配错误

您好,我有一个问题想问您,希望您能帮帮我!我在这里只写了使用item.h在双指针中添加3个元素的说明。所以当我写“ Item * a”就像void ** a,对吗?无论如何,如果我在没有重新分配的情况下将malloc与dim = 20一起使用,则该程序可以工作,但是如果我想从dim = 3开始,并且在每次insert_element之后我将重新分配与dim + 1一起使用时,就会出现分段错误。 当我有双指针时,是否就像动态数组一样,带有指向其他int指针的Item(别名void)指针?提前致谢!

//array.c

#include <stdio.h>
#include <stdlib.h>
#include "utils.h"
#include "array.h"
#include "item.h"

void input_array(Item *a, int n) {
                              int i;
                              for (i=0;i<n;i++) {
                                                printf("Inserisci l'elemento nella posizione %d dell'array\n",i);                          
                                                a[i] = inputItem();            
                              }                                                                                                               
}

void free_array(Item *a) {
                                 free(a);
                                                    }

void output_array (Item *a, int n) {
                                   int i;
                                   for (i=0;i<n;i++) 
                                                 outputItem(a[i]);                              

}

void inselem_array (Item *a, int *n)
{
  int i,pos;
  Item item;
      printf("Inserisci l'elemento per la sostituzione\n");
      item=(inputItem());
     printf("Inserisci la posizione dell'elemento da inserire\n");
     scanf("%d",&pos);
      if (pos<=*n) {
       *n=*n+1;
       a=realloc(a,*n*sizeof(Item));

       i=*n-1;
          while (i>pos)  {
                           a[i]=a[i-1];
                         i--;
         }
     a[i]=item;
      }
      else printf("Hai inserito una posizione non valida\n");

}

//item.h

typedef void *Item;

Item inputItem();
void outputItem(Item);
int cmpItem(Item,Item);

//item.c

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

Item inputItem(){
    int *p;
    p=malloc(sizeof(int));
    scanf("%d",p);
    return p;
}

void outputItem(Item item){
    int *p;
    p=item;
    printf("%d ",*p);
}

int cmpItem(Item item1,Item item2){
    int *p1,*p2;
    p1 = item1;
    p2 = item2;
    return *p1 - *p2;

}

//main.c

#include <stdio.h>
#include <stdlib.h>
#include "item.h"
#include "array.h"


int main (void) {
  int dim=3;
Item *a;
 int scelta=0,b=0;
printf("1 - Inserimento dati in un array\n");
printf("2 - Eliminazione dell'array\n");
printf("3 - Inserimento di un elemento nell'array\n");
printf("4 - Cancellazione di un elemento nell'array\n");
printf("5 - Ordinamento degli elementi dell'array\n");
printf("6 - Randomizzazione dell'array\n");
printf("7 - Stampa dati dell'array\n");
printf("-1 - Per uscire dal programma");
do {
printf("\nInserisci un numero tra quelli elencati per scegliere cosa fare\n");
scanf("%d",&scelta);
switch (scelta)
{
 case 1:
  a=malloc(dim*sizeof(Item));
  input_array(a,dim);
  b=1;
  break;
 case 2:
  if (b==1) {
    free_array(a);
    printf("Lo spazio di memoria allocato per l'array è stato liberato");
  } 
  else printf ("L'array già non è presente");

  break;
 case 3:
 inselem_array(a,&dim);
 printf("la dimensione e' %d",dim);
 break;
  case 4:
 cancelem_array(a,&dim);
 break;
  case 5:
 bubble_sort(a,dim);
 break;
 case 6:
  random_array();
  break;
case 7:
  output_array(a,dim);
  break;
default:
if (scelta!=-1) printf ("Scelta non riconosciuta\n");
  break;
}
    }
while (scelta!=-1);    
return 0;
          }


评论