Avevo messo solo quella parte perché visto che per l'altra funziona bene pensavo il problema fosse lì.
Ecco tutto il programma:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 50

struct INFO{
    int codice;
    char nome[50];
    float prezzo;
    int npezzi;
};

struct INFO *duplicaStruct(struct INFO *s, int i){
    struct INFO *s2 = (struct INFO *)malloc(sizeof(struct INFO));
    s2[i].codice = s[i].codice;
    strcpy(s2[i].nome, s[i].nome);
    s2[i].npezzi = s[i].npezzi;
    s2[i].prezzo = s[i].prezzo;
    return s2;
}
struct INFO *riempiStruct(){
    struct INFO *s=(struct INFO *)malloc(sizeof(struct INFO));
    printf("Codice: ");
    scanf("%d", &(s->codice));
    printf("Nome: ");
    scanf("%s", s->nome);
    printf("Prezzo: ");
    scanf("%f", &(s->prezzo));
    printf("Numero pezzi: ");
    scanf("%d", &(s->npezzi));
    return s;
}
int aggiungiStruct(struct INFO **s){
    int n=0,i;
    for (i=0;i<MAXLEN;++i) s[i]=NULL;
    do {
        printf("Quante schede vuoi inserire?");
        scanf("%d",&n);
    } while (n>MAXLEN);
    for (i=0;i<n;++i) {
        s[i]=riempiStruct();
    }
    return n;
}
void stampaStruct(struct INFO **s, int n){
    int i;
    for(i=0;i<n;i++){
        printf("Codice: %d\n", s[i]->codice);
        printf("Nome: %s\n", s[i]->nome);
        printf("Prezzo: %.2f\n", s[i]->prezzo);
        printf("Numero pezzi: %d\n\n", s[i]->npezzi);
    }
}
int main(){
    struct INFO *s[MAXLEN];
    struct INFO *s2[MAXLEN];
    int n=0, i;
    n=aggiungiStruct(s);
    
    for(i=0;i<n;i++){
        s2[i]=duplicaStruct(*s, i);
    }
    
    printf("-----STRUCT 1-----\n");
    stampaStruct(s, n);
    printf("-----STRUCT 2-----\n");
    stampaStruct(s2, n);
}