C uint8_t数组内存在函数调用中不可访问

时间:2017-12-08 04:52:24

标签: c arrays

我有一个简单的字节数组结构:

typedef struct ByteArray {
    int size;
    uint8_t* arr;
} ByteArray;

我正是这样创造的:

ByteArray* byte_array_create(size_t size) {
    ByteArray* a = malloc(sizeof(ByteArray));
    a->size = size;
    a->arr = (uint8_t*)malloc(a->size);
    return a;
}

稍后我在另一个模块中使用它:

static void rom_set_prg_bank(Rom* r, iNESHeader* h, FILE* romFile) {
    r->PRG = byte_array_create(h->numPRG * 0x4000);
    size_t size = fread(r->PRG->arr, r->PRG->size, 1, romFile);
    byte_array_print(r->PRG->arr);
}

现在在rom_set_prg_bank()内部r-> PRG-> arr已经分配了内存,一切看起来都不错。我可以查看内存块并查看所有内容。一旦进入byte_array_print(),我就会遇到错误的访问错误。

void byte_array_print(ByteArray* a) {
    for(int i = 0; i < a->size; i++) {
        // EXC_BAD_ACCESS (code=EXC_I386_GPFLT) happens 
        // when I try to access any of the values in the
        // byte array
        printf(a->arr[i]);
    }
}

谁能看到我做错了什么?

1 个答案:

答案 0 :(得分:0)

byte_array_print(r->PRG->arr);

传递定义为ByteArray结构元素的已分配缓冲区,但byte_array_print需要指向完整ByteArray结构的指针,而不是缓冲区。修复它:

byte_array_print(r->PRG)