所以我决定为C中的微控制器编写我自己的Big Integer库(PIC32,如果重要的话),但我有一个我不明白的奇怪问题。代码运行时,big_int_t
结构a
和b
位于不同的内存位置,但a->bytes
和b->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]);
}
答案 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
放置在相同位置之前。因此,这两个分配会导致相同的指针。