[英]Initializing arrays in struct
因此,我決定為C中的微控制器(如果重要的是PIC32)編寫自己的Big Integer庫,但是我遇到了一個我不理解的怪異問題。 運行代碼時, big_int_t
結構a
和b
位於不同的內存位置,但是a->bytes
和b->bytes
似乎位於同一位置(通過打印其指針確認)。 以b->bytes
設置值也會更改a->bytes
的值。 在下面的主要功能中,從任一結構的bytes
數組中打印第一個元素均顯示41
。 難道我做錯了什么?
#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]);
}
在big_init
,變量bytes
是局部變量,該變量將超出范圍並在函數返回后消失。 函數返回時,存儲在big->bytes
的指針將成為雜散指針,而取消引用該指針將導致未定義的行為 。
您不能為此使用本地數組,而需要使用malloc
動態分配該數組:
big->bytes = malloc(sizeof(*big->bytes) * big->size);
但是,一旦完成,別忘了free
內存。
您正在堆棧上分配字節緩沖區:
uint8_t bytes[size];
當big_init退出時,緩沖區不再有效。 它將被隨機覆蓋。
您可能想使用malloc()
動態分配它,但是您必須小心再次釋放它。
出現這種現象的原因是,您正在堆棧上分配帶有指針的bytes
。 首次調用big_init
時,局部變量bytes
將被放置在堆棧中,並且其地址將用於結構中的bytes
。 之后,您將再次調用函數big_init
。 現在,將建立與以前相同的堆棧,並且將本地變量bytes
放置在與以前相同的位置 。 因此,兩個分配導致相同的指針 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.