0

我有带有 vs2010 的 Windows 8,当我运行这部分程序时,显示此错误:运行时检查失败 #2 - 变量“seqA”周围的堆栈已损坏。..................................................... ......................

#include <iostream.h>
#include <stdio.h>
#include <string>
#include<stdlib.h>
#include <fstream>
using namespace std;

    int main(){
int lenA = 0;
int lenB = 0;
FILE * fileA, * fileB;
char holder;
char seqA[10], seqB[10];

/*open first file*/
fileA=fopen("c:\\str1.fa", "r");

/*check to see if it opened okay*/
if(fileA == NULL) {
    perror ("Error opening 'str1.fa'\n");
    exit(EXIT_FAILURE);
}


/*open second file*/
fileB = fopen("c:\\str2.fa", "r");

/*check to see if it opened okay*/
if(fileB == NULL) {
    perror ("Error opening 'str1.fa'\n");
    exit(EXIT_FAILURE);
}

/*measure file1 length*/
while(fgetc(fileA) != EOF) {
    holder = fgetc(fileA);
    seqA[lenA]=holder;
    lenA++;
}
lenA--;

fclose(fileA);

holder='0';

/*measure file2 length*/
while(fgetc(fileB) != EOF) {
    holder = fgetc(fileB);
    seqB[lenB]=holder;
    lenB++;
}
lenB--;

fclose(fileB);  

此错误的链接图片

4

3 回答 3

0

This:seqB[lenA]=holder; lenA++;将溢出,除非您的文件非常短(10 个字符或更少(同样使用seqBand lenB.

于 2013-03-01T20:08:49.317 回答
0

您将 seqA 和 SeqB 初始化为 10 个字符。我认为该文件比那个大,并且您通过在序列数组之外写入来破坏堆栈。为序列分配更多内存。

于 2013-03-01T20:08:57.740 回答
0

您读取文件的方法不安全。你有一个 char [10] 的变量,但是如果你的文件有超过 10 个字符会发生什么?您将使用seqA[10] = holder;(例如)在内存中写入,顺便说一下您将覆盖堆栈。我认为这就是问题所在。一种解决方案是在读取 10 个字符后中断或使用动态分配的数组并在达到其大小时重新分配它。

于 2013-03-01T20:12:21.910 回答