2

我的最终功能之一有问题。我的目标是太对待一张照片。我在标题中声明:

#define PICTURESIZE 1024
typedef unsigned char Picture[PICTURESIZE][PICTURESIZE];
typedef unsigned char LinearBlocPicture[PICTURESIZE*PICTURESIZE];

我将此标头包含在另一个文件中,其中只有一个功能:

LinearBlocPicture picture2BlocVector (Picture image){
    LinearBlocPicture pictureModify;
    int curseurLinearBlocPicture = 0; 
    unsigned char blocPixel[8][8]; 
    unsigned char* bufferLinearBlocPicture;
    int x,y,i,j,k;  


    for(y=0; y < 1024; y=y+8) { 
        for(x=0; x < 1024; x=x+8) { 
            for(j=0; j < 8; j++) { 
                for(i=0; i<8; i++) { 
                    blocPixel[i][j] = image[x+i][y+j];
                } 
            }  

            bufferLinearBlocPicture = bloc2Vector (blocPixel);

            for (k=0; k<64; k++){
                pictureModify[curseurLinearBlocPicture+k] = bufferLinearBlocPicture[k];
            }

            curseurLinearBlocPicture = curseurLinearBlocPicture + 64;
        } 
    }

    return pictureModify;
}

这个函数应用我的处理,问题来自返回值,以及预期返回什么。当我尝试编译时,我得到了这个:

First line error: ‘picture2BlocVector’ declared as function returning an array
Application.c: In function ‘picture2BlocVector’:
Last line: warning: return makes integer from pointer without a cast
Last line: warning: function returns address of local variable

我不明白为什么返回类型有问题,因为我正确声明了我的类型 LinearBlocPicture。指针问题来自我认为的这一行:

pictureModify[curseurLinearBlocPicture+k] = bufferLinearBlocPicture[k];

我不确定是否可以这样做。谢谢你的帮助。

4

1 回答 1

2

在 C 中,数组通常“衰减”为指针值,因此当您返回一个数组时,您实际上是在返回其第一个元素的地址。在您的示例代码中,您pictureModify在本地堆栈上进行分配,并尝试返回其地址。当您的函数返回时,在其执行期间声明的所有变量都将被清除——这包括您的本地缓冲区。

要解决这个问题,您有几个选择:

  1. 用于malloc()分配一块内存,将结果写入其中,然后返回指向它的指针。当你这样做时,你需要确保你的调用代码会调用free()它。
  2. 在调用代码中分配内存,并将指向该缓冲区的指针传递给picture2BlocVector. 这样,您将所有内存管理本地化到一个地方。在这种情况下,您甚至可以创建一个局部变量并传递其地址。
于 2013-09-24T21:20:08.057 回答