2011-09-05 120 views
0
// diskbin.cpp : main project file. 

#include "stdafx.h" 
#include <windows.h> 
#include <iostream> 
#include <fstream> 
#include <conio.h> 
#include <stdio.h> 
#include <sys/stat.h> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    //code 

    if(stat("key.pc.db", &filek) ==0) 
     sizek=filek.st_size; 
    if(stat("seek.pc.db", &files) ==0) 
     sizes=files.st_size; 

    sizek=sizek/sizeof(int); 
    sizes=sizes/sizeof(int); 
    int i,min,max,mid; 
    int *s=new int[sizes]; 
    int *hit=new int[sizes]; 

    //code 
} 

当我运行这个程序在Visual Studio 2008中,我没有得到任何错误,但是当我运行CMD打开,然后关闭,然后它说一个弹出窗口: “ diskbin.exe中发生未处理的异常'System.AccessViolationException' 附加信息:尝试读取或写入受保护的内存,这通常表示其他内存已损坏。可能是什么问题?我没有分配s并正确打?System.AccessViolationException在Visual Studio 2008

谢谢!

+0

要么你没有得到任何错误,要么你得到一个错误。选一个。 –

+0

做一些调试。程序崩溃在哪里? –

+0

@Martino我的意思是它没有在错误窗口中显示。它显示0个错误和0个警告。 – Ava

回答

2

它崩溃,因为你使用未初始化的变量:

int  sizes, sizek; 
    struct stat files, filek; 
    ofstream ofs; 

    if(stat("key.pc.db", &filek) ==0) 
     sizek=filek.st_size; 
    if(stat("seek.pc.db", &files) ==0) 
     sizes=files.st_size; 

    sizek=sizek/sizeof(int); 
    sizes=sizes/sizeof(int); 

如果统计()失败,则使用一个未初始化的SIZEK。 根据未初始化的内存,你的下一个语句会崩溃:

int *s=new int[sizes]; 

因为sizes可以为负或非常大的数字,新会失败。

检查stat()返回的错误,虽然有可能找不到文件key.pc.db,导致函数失败。

+0

嗯昨天我问了一个类似的问题,我被建议使用新的。我没有固定的值来分配它。我还可以做些什么? – Ava

+0

不要使用一个常数值。原因是stat()失败,你应该调查一下,不要只是改变你的代码才行。检查文件是否存在。 –

+0

另请参阅http://msdn.microsoft.com/en-us/library/14h5k7ff(VS.71).aspx并查找失败原因。 –