C: Ошибка сегментации 11 Массив указателей strcpy - PullRequest
0 голосов
/ 08 октября 2018

Код компилируется без ошибок, но я получаю ошибку ошибки сегментации (11), я предполагаю, что проблема в том, что когда я использую функцию strcpy () в строке 82, что-то идет не так, почему я не получаю компиляциюошибки и как я могу это исправить, правильно ли реализованы указатели на массив символов ?.Я не могу изменить текущие структуры кода.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

typedef struct
{
  int n_uea;
  char **nombre;
  double *calificacion;
} UEA;

typedef struct
{
  int n_pais;
  char *nombre[50];
} PAIS;

typedef struct
{
  char nombre[50];
  UEA uea;
  PAIS *pais;
} ALUMNO;

void AllocPais(PAIS *p, int np){
  p = (PAIS*) malloc(sizeof(PAIS));
  p = &p[0];
  p->n_pais = np;
  for (int i = 0; i < np; i++) {
    p->nombre[i] = (char*) malloc(sizeof(char)*50);
  }
}
void AllocUEA(UEA *u , int nu){
  u->n_uea = nu;
  u->nombre = (char **) malloc(sizeof(char*)*nu);
  for (int i = 0; i < nu; i++) {
    u->nombre[i] =(char*) malloc(sizeof(char)*50);
  }
  u->calificacion = (double*) malloc(sizeof(double) * nu);
}
void AllocAlumnoMemory(ALUMNO *a, int np, int nu){
  AllocPais(a->pais,np);
  AllocUEA(&(a->uea),nu);
}

int main(int argc, char const *argv[]) {
  ALUMNO* arreglo;
  int entradas;
  printf("%s\n","Ingrese el numero de Entradas");
  scanf("%d",&entradas);
  arreglo = malloc(sizeof(ALUMNO)*entradas);
  for (int i = 0; i < entradas; i++) {
    char separator[10];
    char name[20];
    int numUea , numPaises;
    printf("%s\n","Se espera separador");
    scanf("%s",separator);
    printf("%s\n","Ingrese el nombre");
    scanf("%s",name);
    strcpy(arreglo[i].nombre,name);


    printf("%s\n","Ingrese el numero de UEA");
    scanf("%d",&numUea);
    AllocUEA(&arreglo[i].uea,numUea);
    for (int a = 0; a < numUea; a++) {
      char name [15];
      double cal;
      scanf("%s %lf", name, &cal);
      strcpy(arreglo[i].uea.nombre[a],name);
      arreglo[i].uea.calificacion[a] = cal;
    }

    printf("%s\n","Ingrese Numero de paises");
    scanf("%d",&numPaises);
    PAIS nuvp;
    arreglo[i].pais = &nuvp;
    AllocPais(arreglo[i].pais,numPaises);
    for (int b = 0; b < numPaises; b++) {
      char names [15];
      scanf("%s",names);
      strcpy(arreglo[i].pais->nombre[b],names);
    }

  }


  return 0;
}

1 Ответ

0 голосов
/ 08 октября 2018

Пожалуйста, запишите ниже пункты и попробуйте их:

  1. Избегайте использования strcpy/strcat и т. Д. Они не защищают от переполнения буфера.

  2. Используйте взамен strlcpy/strlcat.

  3. При использовании strncpy убедитесь, что NULL завершает строковый буфер.

...