2014-01-20 32 views
0

我試過不同的方法,但最終出錯。請給出一個解決方案和概念的簡要說明。返回有錯誤的二維數組,需要概念

uint8_t **subBytes() 
{ 
    int i,j; 
    uint8_t r,c; 
    uint8_t t[4][4]; 

    for(i=0;i<4;i++) 
    { 
     for (j=0;j<4;j++) 
     { 
      r = pt[p1][j] & 0xf0; 
      r = r >> 4; 
      c = pt[p1][j] & 0x0f; 
      t[i][j] = (uint8_t *) malloc(sizeof(uint8_t)); 
      t[i][j] = sBox[r][c]; 
     } 
     p1++; 
    } 
    return t; 
} 

int main() 
{ 
    uint8_t **temp; 
    temp = subBytes(); 
    for(i=0;i<4;i++) 
    { 
     for(j=0;j<4;j++) 
     { 
      printf("%x ", temp[i][j]); 
     } 
     printf("\n"); 
    } 
} 

這是我的原始碼。在這裏,我使用了malloc,但是它也不起作用。

回答

0

m是局部變量。當add返回時,m被銷燬!

您不應該返回局部變量的指針或引用。請看下面的代碼:

int foo() { return 1; } 
int *bar() { int i = 1; return &i; } 

當我打電話foo(),則返回1

當我打電話bar(),它試圖返回局部變量,i的地址。但是當bar()返回時,i變量被銷燬!所以返回指針變成垃圾指針。 (對不起,我不知道怎麼說英語這個詞;)

你應該像使用:

void bar(int *ret) { *ret = 1; } 

int i; 
bar(&i); /* now i is 1 */ 

int *bar() 
{ 
    int *p = (int *)malloc(sizeof(int)); 
    *p = 1; 
    return p; 
} 

int *pi = bar(); 
/* now *pi is 1 */ 

... 

free(pi); /* You MUST free pi. If not, memory lack is coming~ */ 

(我建議第一個第二。一個需要空閒並且可能會被誤認爲)。

+0

int add(){int p = 9;返回p;}。這裏「p」也是一個局部變量,但我可以在main()中使用返回值?它是如何?我的目的是要返回一個矩陣,你可以在我的代碼中顯示我,我們該怎麼做? – Melvin

+0

@Melvin查看編輯 – ikh

0

當一個變量在函數中被聲明(靜態分配)時,它被放置在所謂的棧上,該棧只對該函數是本地的。當程序離開函數的作用域時,變量不再保證被保留,所以返回的指針本質上是無用的。

你有三種選擇,以解決您的錯誤:

  1. 不要做

    簡單地聲明在同一個函數數組,你使用它,不要試圖返回打擾來自另一個函數的指針。

  2. 一個指針傳遞給一個局部變量主要

    指向一個局部變量主要將是有效的,直到主的回報,那麼你可以這樣做:

    void subBytes(uint8_t t[4][4]){ 
        //perform initialization of matrix on passed variable 
    } 
    
    int main(){ 
        uint8_t temp[4][4]; 
        subBytes(&temp); 
        //... 
    }  
    
  3. 動態分配

    這可能會給你更多的錯誤,而不是在這種情況下解決的錯誤,但是如果你對返回一個指向矩陣的指針心存疑慮,那麼你可以爲數組存儲內存然後返回它,但之後你將不得不free()

    在C中,有幾種方法可以動態分配二維數組。首先是將其創建爲單個數組,並對索引進行操作以將其視爲2D。

    //... 
    int *arr = (int *)malloc(rows*cols*sizeof(int)); 
    for (int i = 0; i<rows; i++){ 
        for (int j = 0; j<height; j++){ 
         arr[i*height + j] = i*j; //whatever 
        } 
    } 
    
    return arr; // type is int * 
    //... 
    

    注意,在這個方法中,你不能使用array[i][j]語法,因爲編譯器不知道的寬度和高度。

    第二種方法是將其視爲一個數組數組,因此存儲指向其他數組的指針數組。

    //... 
    int **arr = (int **)malloc(rows*sizeof(int *)); 
    for (int i = 0; i<rows; i++){ 
        arr[i] = (int *)malloc(cols*sizeof(int)); 
    } 
    
    arr[i][j] = 86; //whatever 
    
    return arr; //type is int ** 
    //... 
    

欲瞭解更多信息,請參見:Pointer to Local Variable

+0

int add(){int p = 9;返回p;}。這裏「p」也是一個局部變量,但我可以在main()中使用返回值?它是如何?我的目的是要返回一個矩陣,你可以在我的代碼中顯示我,我們該怎麼做?在我的原始代碼下面給出 – Melvin

+0

,uint8_t ** subBytes() {int i,j; uint8_t r,c; uint8_t t [4] [4]; 爲(I = 0; I <4;我++) { 對於(j = 0;Ĵ<4; J ++) { R = PT [P1] [j]的& 0xf0; R = R >> 4; c = pt [p1] [j] & 0x0f; t [i] [j] =(uint8_t *)malloc(sizeof(uint8_t)); t [i] [j] = sBox [r] [c]; } p1 ++; } return t [0]; } void AddRoundKey(uint8_t t [4] [4]) {int i,j; (i = 0; i <4; i ++) p ++;對於(j = 0; j <4; j ++) pt [p] [j] = t [i] [j]^k.m [p-4] [j]的 。 } } } – Melvin

+0

請不要在評論中發表太多的代碼。我會編輯並嘗試回答你的問題。 – andars

0

alloced您的矩陣存儲空間是一個局部變量。 LOCAL VARIABLE的範圍僅在該函數內。

當您返回時,它將被丟棄。

在您的代碼中,它是uint8_t t[4][4]

t在return t之後立即丟棄。

因此,您什麼都不返回,並可能導致未定義的行爲。

您應該使用malloc爲您的矩陣分配內存,而不是僅在本地聲明它。

在代碼

uint8_t **t. 

t = malloc(sizeof(uint8_t) * 16) //size of a 4x4 matrix 

然後用噸爲兩個維陣列,並返回t.like

t[0][0] = 1; 

不忘記後釋放它使用它出側的功能的。

free(t);