2013-04-07 64 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