C:分段错误11 strcpy指针数组

时间:2018-10-08 05:15:54

标签: c segmentation-fault

代码编译没有错误,但是我遇到了分段错误错误(11),我猜问题是当我在第82行中使用strcpy()函数时,出现了问题,为什么我没有得到任何编译错误以及如何解决,char数组指针是否实现正确?我不能改变当前的代码结构。

#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 :(得分:-1)

请记下以下几点并尝试:

  1. 避免使用strcpy/strcat等。它们不能防止缓冲区溢出。

  2. 改为使用strlcpy/strlcat

  3. 使用strncpy时,请确保对NULL终止字符串缓冲区。