-1

我写了一个函数,它将一个结构数组二进制复制到另一个。问题是它不能正常工作,我不知道为什么。对我来说一切似乎都很好。

  • 像素是具有 3 个无符号字符的结构,sizeof(pixel) = 3,
  • pixarr1 是指向二维动态数组 [8][2] 的指针,
  • pixarr2 是指向二维动态数组 [8][n] 的指针。例如,n = 8,这并不重要。

我需要做这样的事情:

for(int i=0; i<8; i++) {
    for(int y=0; y<2; y++) {
        arr2[i][y] = arr1[i][y];
    }
}

但我想做“二进制”。像这样:

void copyStruct(pixel*** pixarr1, int startline, int height, pixel*** pixarr2) {

    pixel** arr1 = *pixarr1;
    pixel** arr2 = *pixarr2;
    unsigned char buffer[16];

    int sizeofstruct = height*3*8;
    int padding;

    for(int i=0; i<=sizeofstruct; i+=16) {
        if ( i+16 > sizeofstruct) {
            padding = sizeofstruct-i;
            memcpy(buffer, arr1+i, padding);
            memcpy(arr2+(startline*8)+i, buffer, padding);
        } else {
            memcpy(buffer, arr1+i, 16);
            memcpy(arr2+(startline*8)+i, buffer, 16);
        }
    }
}

我犯了什么错误?

PS。对不起,源代码的问题,这个编辑器是..

聚苯乙烯。请不要专注于指针的使用。我必须使用它们。如果我在函数内外打印指针,我会看到相同的地址,所以这很好(在我的逻辑中)。

4

1 回答 1

0

您可以使用指针将数组传递给函数,但不能使用指针对指针传递多维数组。您可以在此处阅读有关创建指向多维数组的指针的更多信息:

编辑: 我们真的需要更多信息。“不能正常工作”到底是什么意思?数据被复制但最后一个字节丢失?程序崩溃?机器蓝屏并开始冒烟?请准确告诉我们您看到该程序的作用以及它与您的预期有何不同。

鉴于此处完成的指针操作量,我强烈建议在调试器中单步执行代码,并在每一步仔细检查每个指针。这应该清楚地表明事情开始出错的地方,并就原因给出强有力的提示。

如果更高级别(非memcpy)版本代码有效,我建议检查为该函数发出的程序集,并将其与为memcpy基于 - 的版本发出的程序集进行比较。一些库memcpy使用字节大小的副本循环实现,这将使您的二进制版本实际上等同于更高级别的版本。如果是这种情况,那么memcpy除了增加复杂性之外,您可能不会通过使用该版本获得太多收益。

于 2012-04-10T20:27:32.867 回答