错误:运行时检查失败#2 - 变量周围的堆栈已损坏

时间:2017-09-24 18:34:39

标签: c++

我试图从.text文件中读取一个结构,然后将其保存在一个新的文本文件中以查看它是否有效,但是当它被保存时,臭名昭着的错误出现在"运行时检查失败#2 - 围绕变量' pers'已损坏" 。 我不知道应该给 struct persona pers 赋予哪个尺寸以使其工作。 这是.txt文件:

  

Mirio Togata

     

18937332

     

15/7/1951

     Shigaraki Tomura

     

17304739

     

24/11/1930

这是代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#define LNOM 32
#define TAM 2 /*The size I established for the struct persona is 2 because there are 2 people*/

struct fecha { int d, m, a; };
struct persona
{
  char nombre[LNOM];
  int dni;
  struct fecha nacim;
};

int readText(struct persona l[], int cant)
{
  printf("Leyendo...\n");
  char nom[LNOM];
  FILE *pf = fopen("persona.txt", "r");
  if (pf)
  {
    fgets(nom, LNOM, pf);
    while (!feof(pf))
    {
        strcpy(l[cant].nombre, nom);
        fscanf(pf, "%d", &l[cant].dni);
        fgetc(pf);
        fscanf(pf, "%d/%d/%d", &l[cant].nacim.d, &l[cant].nacim.m, &l[cant].nacim.a);
        fgetc(pf);
        cant++;
        fgets(nom, LNOM, pf);
    }
    fclose(pf);
  }
return cant;
}

void saveText(struct persona l[], int cant)
{
  printf("Grabando...\n");
  int i;
  FILE *pf = fopen("personados.txt", "w");
  if (pf)
  {
    for (i = 0; i < cant; i++)
    {
        fprintf(pf, "%s\n", l[i].nombre);
        fprintf(pf, "%d\n", l[i].dni);
        fprintf(pf, "%d/%d/%d\n", l[i].nacim.d, l[i].nacim.m, l[i].nacim.a);
    }
    fclose(pf);
  }
}

int main(void)
{
  int cant = 0;
  struct persona pers[TAM];
  cant = readText(&pers[TAM],cant);
  saveText(&pers[TAM],cant);
  return 0;
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先是数组索引的复习。

pers[0]

提供persona中的第一个pers

pers[1]

将提供第二个,

pers[2]

将是第三个。这个序列可以持续很长一段时间,但因为

#define TAM 2

将所有TAM替换为2

struct persona pers[TAM];

成为

struct persona pers[2];

所以pers只有两个有效的条目。这也意味着

pers[TAM] 

成为

pers[2] 
我们在上面看到的

获得pers中的第三个元素,我们现在知道pers中没有第三个元素。

所以

cant = readText(&pers[TAM],cant);

获取pers不存在的第三个元素的地址,并将其作为readText传递到l。由于l指向pers的有效范围,因此读入l指向的元素将损坏堆栈并导致错误消息。

解决方案是阅读pers&pers[0]&pers[1]的有效元素。由于readText将从文件中读取两个条目,从&pers[1]开始并读入元素2,不建议使用不存在的元素3.