繁体   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