C ++: EXC_BAD_ACCESS при передаче указателя массива, полученного из вектора

Редактировать: я понял это. Когда deflateReadOut () создавал экземпляр массива, он был слишком большим, чтобы находиться в стеке, поэтому он вызывал ошибку 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);
}

Спасибо за любую помощь, которую вы можете оказать.

0

Решение

Это:

chunk.reserve(4);

Должно быть:

chunk.resize(4);

В противном случае вы просто увеличиваете емкость вместо фактического размера вектора.

Вы также можете инициализировать вектор в списке инициализации:

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

}

Это эквивалентно увеличению размера и инициализации отдельных векторов.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]