我一直在使用指针结构获取分段错误,但我不知道为什么

i'm trying to save in usuarios_st->datos_carton->numero_cartonchar a string, but i'm keep getting the segementation fault error, i'll paste the entire code here, please be gentle i'm new at C and beforehand thanks for your attention and waiting for your reply.

main.c

int main(int argc, char **argv){
  char *usuarios;
  int ancho = atoi(argv[1]);
  int alto = atoi(argv[2]);
  int mul_AA = alto * ancho;
  int condition = 0;
  int numcartones = 0;
  int h = 0;
  int j = 0;
  int con = 1;
  int i = 0; //i = posición
  do{
    printf("%d\n", ancho);
    printf("%d\n", alto);
    int valor_menu = 0;
    do{
      printf("1- Introducir jugador\n");
      printf("2- Mostrar Cartones\n");
      printf("3- Salir\n");
      scanf("%d", &valor_menu);
    }while(valor_menu > 3 || valor_menu < 1);
    struct carton_t *cartones = malloc(sizeof(struct carton_t));
    struct usuario_t *usuarios_st = malloc(sizeof(struct usuario_t));
    usuarios_st->datos_carton = cartones;
    switch(valor_menu){
      case 1:
        condition = Introducir_jugador(&usuarios_st[i], mul_AA, &cartones[i], i);
        if(condition == 0){
          printf("números introducidos no validos\n");
          con = 1;
        }
        break;
        case 2:
        while(cartones->numero_carton[h] != '\0'){
          h++;
        }
        numcartones = h;
          printf("numero de cartones %d\n", h);
          for(int p = 0; p <= numcartones; p++){
            Mostrar_cartones(&cartones[p], ancho, alto, p);
          }
        break;
        case 3:
          con = 0;
        break;
        default:
        return(0);
        break;
      }
      i++;
    }while(con != 0);
}

宾果

#include"bingo.h"
int Introducir_jugador(struct usuario_t *usuarios_st, int mul_AA, struct carton_t *cartones, int i){
  printf("\nNombre del Jugador: \n");
  scanf("%s" , &usuarios_st->datos_nombre);
  printf("%s\n", usuarios_st->datos_nombre);
  printf("\nIntroduzca los numeros separados por comas y sin espacios: \n");/*Enter the numbers separated by commas and without spaces:*/
  scanf("%s" , &(usuarios_st->datos_carton->numero_cartonchar));
  cartones->numero_carton[i][0] = atoi(strtok(usuarios_st->datos_carton->numero_cartonchar, ","));
  if(cartones->numero_carton[i][0] < 0 || cartones->numero_carton[i][0] > 99){
    return(0);
  }
  for(int p = 1; p < mul_AA; p++){
    cartones->numero_carton[i][p] = atoi(strtok(NULL, ","));
    if(cartones->numero_carton[i][p] < 0 || cartones->numero_carton[i][0] > 99){
      return(0);
    }
  }
}
void Mostrar_cartones(struct carton_t *cartones, int ancho, int alto, int p){
  int x = 0;
  while(cartones->numero_carton[x] != '\0'){
    x++;
  }
    for(int g = 0; g < x; g++){
      for(int z = 0; z <= alto; z++){
        for(int n = 0; n <= ancho; n++){
          printf("%d", cartones->numero_carton[p][g]);
        }
        printf("\n");
      }
      printf("\n\n");
    }
}

宾果游戏

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct carton_t{
  char *numero_cartonchar;
  int *numero_marcado;
  int **numero_carton;
};
struct usuario_t{
    struct carton_t *datos_carton;
    char datos_nombre[100];
};
int Introducir_jugador(struct usuario_t *usuarios_st, int mul_AA, struct carton_t *cartones, int i);
void Mostrar_cartones(struct carton_t *cartones, int ancho, int alto, int p);