C函数返回没有强制转换的数组和指针

时间:2013-09-24 21:12:44

标签: c

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

#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];

我不确定是否被允许这样做。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

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

要解决这个问题,您可以选择以下几种方法:

  1. 使用malloc()分配内存块,将结果写入其中,然后返回指向它的指针。执行此操作时,您需要确保您的主叫代码会在其上调用free()
  2. 在您的调用代码中分配内存,并将指向该缓冲区的指针传递给picture2BlocVector。这样,您就可以将所有内存管理本地化到一个位置。在这种情况下,您甚至可以创建一个局部变量并传递其地址。