我正在使用malloc创建动态结构。我的结构看起来像这样:
typedef struct
{
int v=;
int t;
struct a *prev;//points to previous struct in same row
struct a *next;//points to next struct in same row
//Is this correct notation?
} a;
a **b;
在初始化期间,我这样做:
for(i=0;i<d1;i++)
{
for(j=0;j<d2;j++)
{
if (j==0) //if first block, point to NULL
b[i][j]->prev = NULL;
else //else point to previous block.
b[i][j]->prev = *(b[i] + j - sizeof(b[i][j]));
}
}
我收到错误无效的类型参数。这有什么不对?对于prev,我试图首先找到当前块*(b[i]+j)
的地址并获取前一个块的地址,减去每个块的大小,即sizeof(b[i][j])
答案 0 :(得分:1)
b[i][j]
不是指针。因此,你不能使用:
b[i][j]->prev = NULL;
使用
b[i][j].prev = NULL;
<强>更新强>
可以使用以下方法创建对象之间的链接:
for(j=0;j<d2;j++)
{
// Fix the prev link
if (j==0) //if first block, point to NULL
b[i][j].prev = NULL;
else //else point to previous block.
b[i][j].prev = &b[i][j-1];
// Fix the next link
if (j==d2-1) //if last block, point to NULL
b[i][j].next = NULL;
else //else point to next block.
b[i][j].next = &b[i][j+1];
}
答案 1 :(得分:1)
我猜你希望每行中的元素都被链接,但不能与之前的行相对应。我的看法:
void
fill(void)
{
int d1;
int d2;
a **b;
a *x;
int i;
int j;
d1 = 10;
d2 = 20;
b = calloc(d1 * d2,sizeof(a));
x = &b[0][0];
for (i=0; i<d1; i++) {
x->prev = NULL;
x->next = x + 1;
for (x++, j=1; j<d2; j++, x++) {
x->prev = x - 1;
x->next = x + 1;
}
x[-1].next = NULL;
}
}
更新:
向指针添加n时的指针运算。如果n为1,则不在地址中添加1,您需要添加sizeof(* ptr)。请考虑以下所有内容都是等效的:
int *xp;
int n;
(A1) xp += n;
(A2) xp = (int *) (((unsigned long) xp) + (n * sizeof(int)))
(A3) xp = &xp[n];
(A4) xp = (int *) (((char *) xp) + (n * sizeof(int)))
盯着这一段时间,直到你真正理解为什么这是真的。这是键。添加到指针的值应该与相同类型的数组的索引值完全相同。
您的代码在某些方面被打破:
- 您需要将b[i][j]->prev
替换为b[i][j].prev
,因为b[i][j]
已经完全取消引用指针[其他人指出了]
- 当您执行*(b[i] + j - sizeof(b[i][j])
时,我甚至不确定您将获得什么。
- 你想要&b[i][j-1]
(A3)。你的代码[如果它可以工作],可能产生&b[i][j-18]
- 这是因为你的混合指针算术和字节大小(例如你正在进行上面的(A1),(A2)和(A3)的混搭 - 你可以使用其中一个但不是两个/全部在同时)
我的代码只需要一个在开头设置的指针,因为它在内循环中递增1。
请注意,在完成&#34; j循环&#34;后,x == &b[i][d2]
也是&b[i+1][0]
。这可能有助于使其更清晰
另外,我在内部j循环之前处理j == 0的情况并且发布修复&#34; j == d2-1&#34;之后的情况。这样,如果内循环内部没有,为什么它从1开始,而不是0
请注意,x[-1].next
(案例A3)为(x - 1)->next
(案例A1)
这里的循环稍微重新编码,以便更简单/更快。它假设一个加法变量:a *ep;
for (i=0; i<d1; i++) {
x->prev = NULL;
x->next = x + 1;
ep = x + d2;
for (x++; x<ep; x++) {
x->prev = x - 1;
x->next = x + 1;
}
x[-1].next = NULL;
}
我认为您已经足够让您的代码正常运行。在那之后,尝试理解你的代码与我的代码,以及为什么两者都按照他们的方式工作。这样做会让你在处理指针和指针算法方面有所作为,它很快就会像通过普通固定大小的数组索引一样容易。快乐编程......