C 从同一内存地址读取不同的值

C 从同一内存地址读取不同的值,c,memory,C,Memory,我正在用C实现karatsuba的乘法算法,调试时发现了这个错误,我无法解释: 在每一步中,我都会将数字分成两半,通过为数据类型分配适当的指针来实现。当我输出我的值时,我得到: a->l: 8 a->u: 4 a->v: 0x51fc270 a: 4072 b->l: 8 b->u: 4 b->v: 0x51fc278 b: 6718 它变成了(对于a) 及(乙) 这两个输出之间没有写访问,前两个结构总是产生相同的输出。 有人能解释这种行为吗?因为我真的迷失

我正在用C实现karatsuba的乘法算法,调试时发现了这个错误,我无法解释: 在每一步中,我都会将数字分成两半,通过为数据类型分配适当的指针来实现。当我输出我的值时,我得到:

a->l: 8 a->u: 4 a->v: 0x51fc270 a: 4072
b->l: 8 b->u: 4 b->v: 0x51fc278 b: 6718
它变成了(对于a)

及(乙)

这两个输出之间没有写访问,前两个结构总是产生相同的输出。
有人能解释这种行为吗?因为我真的迷失了

保存数据的结构如下所示

struct mp_type
{
    int l, u; //length of v and places used (length of number stored)
    char* v; //array which stores the value (the number)
};
typedef struct mp_type mp_int;
最后一个值是存储在数组v中的数字

// high has lower address as low order digits are stored at the end of the array
mp_int low1, low2, high1, high2;
high1.l = high1.u = a->u / 2;
low1.l = low1.u = a->u - high1.u;
low1.v = a->v + low1.u;
high1.v = a->v;
high2.l = high2.u = b->u / 2;
low2.l = low2.u = b->u - high2.u;
low2.v = (b->v + low2.u);
high2.v = b->v;
我就是这样把数字分开的。a->u和b->u始终是偶数


在这里,您可以找到一个更精简的项目版本,它再现了错误。

您需要解释数据结构的外观以及打印的所有这些值的含义。另外,显示一些代码。这些值按顺序表示:由v指向的数组长度位数存储的数字具有v的第一个元素的地址数组中存储的数字在索引a->l-a->u和a->l@wiseveri这让我想起了
联盟是如何运作的,但我不知道你在实践中在做什么,理论上可能是这样(它是一个标准类类型,GNU链接没有什么特别之处)@wiseveri您知道
l1.v=a->v+l1.u
指针是否具有艺术性,使
l1.v
指向
a->v
中的
l1.u
第四个元素,对吗?而那
h1.v=a->v
正在复制指针,而不是数组本身。这是一个变量和字段名太短和/或未记录的好例子。
u
l
字段肯定需要更多解释,以及
l1
h1
等。我注意到评论中有一些解释,但请编辑原始帖子以提供此信息。这将节省评论者大量的时间,并且更有可能生成您想要的答案。
struct mp_type
{
    int l, u; //length of v and places used (length of number stored)
    char* v; //array which stores the value (the number)
};
typedef struct mp_type mp_int;
// high has lower address as low order digits are stored at the end of the array
mp_int low1, low2, high1, high2;
high1.l = high1.u = a->u / 2;
low1.l = low1.u = a->u - high1.u;
low1.v = a->v + low1.u;
high1.v = a->v;
high2.l = high2.u = b->u / 2;
low2.l = low2.u = b->u - high2.u;
low2.v = (b->v + low2.u);
high2.v = b->v;