2011-09-05 119 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並查找失敗原因。 –