在struct中初始化数组

时间:2015-04-03 10:51:52

标签: c arrays struct

所以我决定为C中的微控制器编写我自己的Big Integer库(PIC32,如果重要的话),但我有一个我不明白的奇怪问题。代码运行时,big_int_t结构ab位于不同的内存位置,但a->bytesb->bytes似乎位于同一位置(通过打印他们的指针确认)。在b->bytes中设置值也会更改a->bytes中的值。在下面的主函数中,从struct 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]);
}

3 个答案:

答案 0 :(得分:2)

big_init中,变量bytes是一个本地变量,一个超出范围并在函数返回后消失。存储在big->bytes中的指针在函数返回时将成为一个迷路指针,取消引用指针将导致undefined behavior

您不能使用本地数组,而是需要使用malloc动态分配数组:

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

但是,一旦你完成了记忆,就不要忘记free

答案 1 :(得分:0)

您正在堆栈中分配字节缓冲区:

uint8_t bytes[size];

当big_init退出缓冲区时不再有效。它将被随机覆盖。

你可能想要使用malloc()动态分配它,但是你必须小心再次释放它。

答案 2 :(得分:0)

此行为的原因是您在堆栈上为bytes指定了指针。第一次调用big_init时,局部变量bytes将被放置在堆栈中,它的地址将用于结构中的bytes。之后,您再次调用函数big_init 。现在,构建了与之前相同的堆栈 ,并将局部变量bytes放置在相同位置之前。因此,这两个分配会导致相同的指针