在函数调用中无法访问 C uint8_t 数组内存

标签 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]);
    }
}

有人能看出我做错了什么吗?

最佳答案

byte_array_print(r->PRG->arr);

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

byte_array_print(r->PRG)

关于在函数调用中无法访问 C uint8_t 数组内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47707928/

相关文章:

c - 在单个进程中管理多个套接字(最多 50 个套接字)的最有效方法?

动态分配二维数组时出现 C 段错误

C. 结构体的动态数组

java - 不明白为什么我在填充这个二维数组时遇到索引越界异常

javascript - 读取 json 以使用 jQuery .each() 创建对象数组

c - 兰德每次运行程序时都会生成相同的结果

c - C 中字符串的第一个元音的地址 - 这有什么问题?

c++ - MIPS 语言中的嵌套和递归过程

javascript - 如何在 javascript 中循环遍历数组?

java - 如何删除数组中的最小值?