簡體   English   中英

在struct中初始化數組

[英]Initializing arrays in struct

因此,我決定為C中的微控制器(如果重要的是PIC32)編寫自己的Big Integer庫,但是我遇到了一個我不理解的怪異問題。 運行代碼時, big_int_t結構ab位於不同的內存位置,但是a->bytesb->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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM