[英]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.