首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >realloc覆盖变量( Zynq SoC (Cortex A9)上的Xilinx)

realloc覆盖变量( Zynq SoC (Cortex A9)上的Xilinx)
EN

Stack Overflow用户
提问于 2016-06-08 07:58:45
回答 1查看 272关注 0票数 0

如前所述,我有一个Zynq SoC (ZC706 Eval Board),我正在尝试从SD卡读取图像。为此,我使用了FatFs (e.html)。在我的代码中,我从文件中读取4096字节,并将其保存到缓冲区中。之后,我将缓冲区复制到一个未签名的char指针,在每次读取操作后,该指针的大小都会增加。

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

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

代码语言:javascript
运行
复制
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 
}

有效的守则:

代码语言:javascript
运行
复制
    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函数:

代码语言:javascript
运行
复制
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的指针不是null,所以realloc成功了。如果我使用gdb,在copyU32ArrayToUnsignedCharArray函数中会发生以下情况:

  • 指向变量out的指针为0x001125a8。
  • "size“变量的地址为0x0011309c (存储在此位置的值是正确的)
  • 这两个变量之间的内存空间为0xaf4 =2804dec(两个地址的差异)。
  • 如果copyU32ArrayToUnsignedCharArray函数中的for循环达到i=702和x=2808,大小变量将更改为另一个值。

由衷地,

阿诺

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-08 18:11:41

我从不喜欢的暗示中解决了问题。问题是堆的大小很小。通过编辑链接器脚本文件来增加堆。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37696545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档