c - realloc 覆盖变量(Zynq SoC (Cortex A9) 上的 Xilinx SDK)

标签 c arm realloc xilinx

如上所述,我有一个 Zynq SoC(ZC706 评估板),我正在尝试从 SD 卡读取图像。为此,我使用 FatFs 库 (http://elm-chan.org/fsw/ff/00index_e.html)。 在我的代码中,我从文件中读取 4096 字节并将其保存到缓冲区中。之后,我将缓冲区复制到无符号字符指针,该指针的大小在每次读取操作后都会增加。

然后我使用 realloc,copyU32ArrayToUnsignedCharArray 函数中的 for 循环“失败”,因为 size 变量被输出数组覆盖。

覆盖 copyU32ArrayToUnsignedCharArray 函数中“大小”的代码:

u32 buffer[1024];
unsigned char *img = NULL;
bytesreaded = 0;
for (;;) {
    br=0;
    fr = f_read(&fil, buffer, sizeof(buffer), &br); /* Read a chunk of source file */
    if (fr || br == 0)
        break; /* error or eof */

    img = realloc(img,br);
    copyU32ArrayToUnsignedCharArray(buffer, &img[bytesreaded], br/4); // /4 because u32(32 bit) in to unsigned char(8 bit)
    bytesreaded += br; // update readed bytes 
}

有效的代码:

    u32 buffer[1024];
unsigned char *img = NULL;
img = malloc(512*512*3+100);
bytesreaded = 0;
for (;;) {
    br=0;
    fr = f_read(&fil, buffer, sizeof(buffer), &br); /* Read a chunk of source file */
    if (fr || br == 0)
        break; /* error or eof */

    copyU32ArrayToUnsignedCharArray(buffer, &img[bytesreaded], br/4); // /4 because u32(32 bit) in to unsigned char(8 bit)
    bytesreaded += br; // update readed bytes 
}

copyU32ArrayToUnsignedCharArray 函数:

void copyU32ArrayToUnsignedCharArray(u32 *in, unsigned char* out, uint size){
int i,x;

x = 0;
for (i = 0; i < size; i++) {
    if(size != 1024)
        break;
    in[i] = Xil_In32BE(&in[i]);
    out[x] = (u32) in[i] >> 24;
    out[x + 1] = (u32) in[i] >> 16 & 0x00FF;
    out[x + 2] = (u32) in[i] >> 8 & 0x0000FF;
    out[x + 3] = (u32) in[i] & 0x000000FF;
    x += 4;
}
}

我想使用 realloc,因为我不知道我读取的图像有多大。

更新:
有关不起作用的代码的一些进一步信息。我调试了一下,*img的指针不为空,所以realloc成功了。如果我使用 gdb,copyU32ArrayToUnsignedCharArray 函数中会发生以下情况:
- 指向变量“out”的指针是0x001125a8
-“size”变量的地址是0x0011309c(存储在该位置的值是正确的)
- 这两个变量之间的内存空间是 0xaf4 = 2804 dec (两个地址的差异)
- 如果 copyU32ArrayToUnsignedCharArray 函数中的 for 循环达到 i=702 且 x=2808,则大小变量将更改为另一个值

此致,
阿诺

最佳答案

我根据Notlikethat的提示解决了这个问题。问题是堆大小太小。增加堆是通过编辑链接器脚本文件来完成的

关于c - realloc 覆盖变量(Zynq SoC (Cortex A9) 上的 Xilinx SDK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37696545/

相关文章:

c - 内核土地套接字连接超时

c - Arm Renesas 工具链链接器错误

c - 将矩阵的行数重新分配为大于初始值的数字

c - 在 C 中使用 realloc 按字符读取输入字符

c - 多进程管道

c - 随机函数卡在一个数字上

命令行查看内容 Shared Object Module(lib*.so)

c - 对 `main' 和 _sbrk 的 undefined reference - 自己的静态库中的启动代码

windows-8 - 如何模拟 Windows RT