2013-04-07 25 views
0

編輯:我想通了。當deflateReadOut()實例化時,數組太大而無法在堆棧中,因此在調用它時會拋出EXC_BAD_ACCESS錯誤。有用的鏈接:linkC++:EXC_BAD_ACCESS當傳遞從矢量獲得的數組指針

這個EXC_BAD_ACCESS錯誤讓我難堪。我的程序到目前爲止做的是製作一個包含四個大型無符號字符數組的二維矢量數組,填充位置爲0的數組爲100,並嘗試傳遞指向這個數組的全部100個指針。但是,當它進入函數調用時,會發生EXC_BAD_ACCESS錯誤。我通過打印檢查了數組的完整性,並且打印得很好。下面的代碼。

#include <stdint.h> 
#include <map> 
#include <stdio.h> 
#include <iostream> 
#include <time.h> 
#include <string.h> 
#include <assert.h> 
#include <cstdlib> 
#include <sstream> 
#include <zlib.h> 
#include "Hash.h" 

#define CHUNK 16777216 

using namespace std; 

class WSUMap { 
public: 

    vector<vector <unsigned char> > chunk; 
    int xComp[4]; 
    int yComp[4]; 
    vector<int> priority; 
    Hash hashChunk; 

    WSUMap() { 
     chunk.reserve(4); 
     chunk[0] = vector<unsigned char>(CHUNK); 
     chunk[1] = vector<unsigned char>(CHUNK); 
     chunk[2] = vector<unsigned char>(CHUNK); 
     chunk[3] = vector<unsigned char>(CHUNK); 
     priority.push_back(0); 
     priority.push_back(1); 
     priority.push_back(2); 
     priority.push_back(3); 
     xComp[0] = -1; 
     xComp[1] = -1; 
     xComp[2] = -1; 
     xComp[3] = -1; 
     yComp[0] = -1; 
     yComp[1] = -1; 
     yComp[2] = -1; 
     yComp[3] = -1; 
    } 

    //Important part starts here: 

    void generate() { 
     for (int i = 0; i<CHUNK; i++) { 
      chunk[0][i]=100; 
     } 
     for (int i = 0; i < 16; i++) { 
      for (int j = 0; j < 16; j++) { 
       cout << chunk[0][0] << endl; 
       unsigned char* ch = &chunk[0][0]; 
       cout << ch[0] << endl; 
       deflateReadOut(i, j, ch); //EXC_BAD_ACCESS Here 
      } 
     } 
    } 

    void deflateReadOut(int x, int y, unsigned char* chunk) { 


     int ret, flush; 
     unsigned have; 
     z_stream strm; 
     unsigned char out[CHUNK]; 

     /* allocate deflate state */ 
     strm.zalloc = Z_NULL; 
     strm.zfree = Z_NULL; 
     strm.opaque = Z_NULL; 
     ret = deflateInit(&strm, 1); 
     if (ret != Z_OK); 
     //return ret; 

     ostringstream oss; 
     oss << "map/" << x << "x" << y; 
     string str = oss.str(); 
     FILE* dest = fopen(str.c_str(), "w"); 

     /* run deflate() on input until output buffer not full, finish 
      compression if all of source has been read in */ 
     do { 
      strm.avail_out = CHUNK; 
      strm.next_in = chunk; 
      strm.next_out = out; 

      ret = deflate(&strm, flush); /* no bad return value */ 
      assert(ret != Z_STREAM_ERROR); /* state not clobbered */ 

      have = CHUNK - strm.avail_out; 
      if (fwrite(out, 1, have, dest) != have || ferror(dest)) { 
       (void) deflateEnd(&strm); 
       //return Z_ERRNO; 
      } 

     } while (strm.avail_out == 0); 
     assert(strm.avail_in == 0); /* all input will be used */ 

     /* clean up and return */ 
     (void) deflateEnd(&strm); 
    } 

謝謝你的任何幫助,你可以給。

回答

2

此:

chunk.reserve(4); 

應該是:

chunk.resize(4); 

否則,你只是增加容量,而不是實際的矢量大小。

你也可以初始化在初始化列表中的向量:

WSUMap() 
: chunk(4, vector<unsigned char>(CHUNK)) 
{ 

} 

這相當於增加的大小和初始化單個矢量。

+0

我試過你的建議,他們是有效的分數。但是,在嘗試使用多種組合的建議之後,如果逐步調試器,我仍然會得到EXC_BAD_ACCESS。 – ymom11 2013-04-07 23:24:01

+0

這就是我們可以做的所有事情,如果你沒有提供'deflateReadOut'的代碼,那就是拋出錯誤的地方(根據你的)。 – mfontanini 2013-04-07 23:28:56

+0

它不會進入deflateReadOut。在進入函數之前的調用是錯誤發生時。如果能提供幫助,我會很樂意提供其餘的代碼。 – ymom11 2013-04-07 23:31:53