2013-09-24 31 views
2

我遇到了一個最終函數的問題。我的目標是太照顧一張照片。 我宣佈在頭: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; 
} 

此功能適用於我的治療,問題來自於返回值,預計會有什麼回報。 我得到這個當我嘗試compilate:

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

不,你不能用C這樣做。將結果聲明爲一個指針,在你的函數中分配並返回。 – OldProgrammer

回答

2

在C語言中,數組通常會被「衰減」爲指針值,所以當您返回一個數組時,您基本上會返回其第一個元素的地址。在您的示例代碼中,您在本地堆棧上分配pictureModify,並嘗試返回其地址。當函數返回時,在執行過程中聲明的所有變量都將被清除 - 這包括本地緩衝區。

爲了解決這個問題,你有幾種選擇:

  1. 使用malloc()分配的內存塊,寫你的結果,然後返回一個指向它。當你這樣做時,你需要確保你的調用代碼將會調用free()
  2. 在調用代碼中分配內存,並將指向該緩衝區的指針傳遞給picture2BlocVector。這樣,您就可以將所有內存管理本地化到一個地方。在這種情況下,你甚至可以創建一個局部變量並傳遞它的地址。