简体   繁体   English

C ++:传递从向量中获取的数组指针时的EXC_BAD_ACCESS

[英]C++: EXC_BAD_ACCESS when passing array pointer obtained from vector

Edit: I figured it out. 编辑:我想通了。 When deflateReadOut() was instantiating the array was too large to be in the stack so it threw the EXC_BAD_ACCESS error when it was called. 当deflateReadOut()实例化时,数组太大而无法进入堆栈,因此在调用时会抛出EXC_BAD_ACCESS错误。 Useful link: link 有用的链接: 链接

This EXC_BAD_ACCESS error has me stumped. 这个EXC_BAD_ACCESS错误让我很难过。 What my program does so far is make a 2D vector array containing four large unsigned char arrays, fills the one at position 0 with 100s and tries to pass the pointer pointing to this array with all 100s. 到目前为止,我的程序所做的是制作一个包含四个大型无符号字符数组的二维矢量数组,用100s填充位置0处的一个,并尝试将指向该指针的指针传递给所有100个。 However, when it gets to the function call the EXC_BAD_ACCESS error happens. 但是,当它进入函数调用时,会发生EXC_BAD_ACCESS错误。 I checked the integrity of the array by printing and it prints fine. 我通过打印检查了阵列的完整性,它打印得很好。 Code below. 代码如下。

#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);
    }

Thank you for any help you can give. 感谢您提供任何帮助。

This: 这个:

chunk.reserve(4);

Should be: 应该:

chunk.resize(4);

Otherwise, you're just incrementing the capacity instead of the actual vector size. 否则,您只是增加容量而不是实际的矢量大小。

You could also initialize the vector in the initialization list: 您还可以初始化初始化列表中的向量:

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

}

That's equivalent to incrementing the size and initializing the individual vectors. 这相当于增加大小并初始化各个向量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM