PDA

View Full Version : esercizio malloc() chiedo suggerimenti (PRINCIPIANTE)


9abs
12-02-2020, 19:15
Volevo solo chiedere un'occhiata al codice e delle eventuali correzioni sull'allocazione dinamica..poichè un po insicuro sull'argomento.
Ecco il codice..sembra funzioni.

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


int* carica(int* c);
int* negativi(int* A,int n,int* c);
int* pari(int* A,int n,int* c);

int main(){

int* A;
int* B;
int i,n;
int* c=&n;

A=carica(c); //carico vett
printf("stampo vettore dopo la carica\n");
for(i=0;i<n;i++) //stampo vett
printf("%d\n",*(A+i));


printf("stampo vettore dopo la f pari\n");
B=pari(A,n,c);
for(i=0;i<n;i++) //stampo vett
printf("%d\n",*(B+i));

free(A);
free(B);
}

//----------------------------------------xmalloc per all.dinamica

void* xmalloc(int n){

void* A;
A=malloc(n * sizeof(int));
if(A==NULL)
fprintf(stderr,"errore durante l'allocazione\n");

return A;
}

//---------------------------------------carica un vettore

int *carica(int *c){

int* A;
int i;
int n;
printf("quanti elementi vuoi inserire?\n");
scanf("%d",&n);

A=xmalloc(n);

for(i=0;i<n;i++)
scanf("%d",A+i);
*c=n;
return A;
}

//----------------------------------cerco i numeri pari

int* pari(int A[],int n,int* c){


int i,j;
int* B;
int count=0;

for(i=0;i<n;i++){
if(A[i]%2==0)
count++;

}

*c=count;
B=xmalloc(count);

j=0;
for(i=0;i<n;i++){
if(A[i]%2==0){
B[j]=A[i];
j++;
}
}

return B;

}





spero sia stato indentato decentemente. Grazie per l'aiuto!

pabloski
13-02-2020, 13:05
int* c=&n;

A=carica(c);

Why? Non puoi chiamare carica(&n)?

xmalloc?? --> stampa il messaggio, ma poi in carica non verifichi se A==null...quello è un bug

inoltre esiste xmalloc in alcuni sistemi operativi, come funzione non standard...potresti avere delle collisioni

poi A+i in scanf, è corretto, ma non idiomatico...usa &A[i]

stessa cosa per *(A+i)...usa A[i]

usa gli indici per accedere ad un array...e si, un puntatore ad un'area di memoria allocata dinamicamente, contenente n elementi tutti dello stesso tipo, è un array

per il resto, a prima vista, non vedo errori