我的最终功能之一出了问题。我的目标也是对待一张照片。 我在标题中声明:
#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];
我不确定是否被允许这样做。 谢谢你的帮助。
答案 0 :(得分:2)
在C中,数组经常“衰减”到指针值,所以当你返回一个数组时,你实际上是返回它的第一个元素的地址。在示例代码中,您在本地堆栈上分配pictureModify
,并尝试返回其地址。当函数返回时,将清除在执行期间声明的所有变量 - 这包括本地缓冲区。
要解决这个问题,您可以选择以下几种方法:
malloc()
分配内存块,将结果写入其中,然后返回指向它的指针。执行此操作时,您需要确保您的主叫代码会在其上调用free()
。picture2BlocVector
。这样,您就可以将所有内存管理本地化到一个位置。在这种情况下,您甚至可以创建一个局部变量并传递其地址。