2015-04-03 163 views
0

中的數組所以我決定在C語言中編寫我自己的Big Integer庫(PIC32),但是我有一個我不明白的奇怪問題。代碼運行時,big_int_t結構ab位於不同的內存位置,但a->bytesb->bytes似乎位於相同的位置(通過打印指針確認)。在b->bytes中設置一個值也會更改a->bytes中的值。在下面的主函數中,從結構的bytes數組中打印第一個元素顯示爲41。難道我做錯了什麼?初始化struct

#include <stdint.h> 
#include <stdio.h> 

typedef struct { 
    uint8_t size; 
    uint8_t *bytes; 
} big_int_t; 

void big_init(big_int_t *big, uint8_t size) { 
    big->size = size; 
    uint8_t bytes[size]; 
    big->bytes = bytes; 
    uint8_t i; 
    for(i=0;i<big->size;i++) big->bytes[i] = 0; 
} 

int main() { 
    big_int_t a,b; 
    big_init(&a,1); 
    big_init(&b,1); 
    a.bytes[0] = 16; 
    b.bytes[0] = 41; 
    printf("%d\n",a.bytes[0]); 
    printf("%d\n",b.bytes[0]); 
} 
+0

使用'malloc'獲取'bytes'的內存。不要使用堆棧變量。 – Matt 2015-04-03 10:55:52

回答

2

big_init變量bytes本地變量,一個將走出去的範圍和消失,一旦函數返回。當函數返回時,存儲在big->bytes中的指針將成爲一個流浪的指針,並且取消引用該指針將導致undefined behavior

不能使用本地陣列對於這一點,而不是你需要用malloc動態分配數組:

big->bytes = malloc(sizeof(*big->bytes) * big->size); 

但是,一旦你用它做不要忘記free內存。

0

你在堆棧上分配的字節緩衝區:

uint8_t bytes[size]; 

當big_init退出緩衝不再有效。它會被隨機覆蓋。

您可能想要使用malloc()動態分配它,但是必須小心再次釋放它。

0

此行爲的原因是您將bytes指定爲堆棧上的指針。當第一次呼叫big_init時,本地變量bytes將被放置在堆棧上並且它的地址將被用於結構中的bytes。之後,您再次調用功能big_init。現在,建立與前面相同的堆棧,並且將本地變量bytes放置在與之前相同的位置相同位置處。因此,這兩項任務導致相同指針