+ -
当前位置:首页 → 问答吧 → malloc函数类型转换问题

malloc函数类型转换问题

时间:2010-06-30

来源:互联网

请教一下malloc函数问题:

建立链表时,每次只是malloc一个节点,节点本身并不大,但是malloc也是要为这个节点开辟至少一个内存页,
我觉得利用率比较低,而且可能导致内存碎片,所以我想每次malloc时多建几个节点,如下:
typedef struct {
        int a;
        struct node * n;
} node;

int main()
{
        node * p, *q;
        int i = 10;
        p = (node *)malloc(sizeof(node) * 10);
        q = p;
        while (i--) {
                q->n = (node*)(q+1);//这行编译不过去,错误信息:warning: assignment from incompatible pointer type
                q->a = i;
                q++;
        }
        free (q);
        return 0;
}

但是编译不过去,
p,q 都定义为node *,为什么还包类型不兼容?

作者: tianhailong   发布时间: 2010-06-30

  1. typedef struct {
  2.         int a;
  3.         struct node * n;
  4. } node;
复制代码
定义的原因吧

作者: ljysyn   发布时间: 2010-06-30



QUOTE:
请教一下malloc函数问题:

建立链表时,每次只是malloc一个节点,节点本身并不大,但是malloc也是要为这 ...
tianhailong 发表于 2010-06-30 19:46




    建议LZ先看看C的struct是如何定义的,还有这样子建立链表没的啥子意义,反而每个节点还浪费4个字节空间。

作者: wmmy2008   发布时间: 2010-06-30

1.
  1. typedef struct tag_node{
  2.         int a;
  3.         struct tag_node *n;
  4. } node;
复制代码
2.程序的内存分配有问题。

作者: memoryboxes   发布时间: 2010-06-30

晕还有这样定义结构的,昏。
看楼主的样子还是用结构数组好了。。。

作者: peijue   发布时间: 2010-06-30



QUOTE:
但是malloc也是要为这个节点开辟至少一个内存页,我觉得利用率比较低
tianhailong 发表于 2010-06-30 19:46





说正题
  1. typedef struct { // 一个匿名的tag A
  2.         int a;
  3.         struct node * n;
  4. } node;          // struct A 被赋予一个别名
  5.                  // 别名叫node
复制代码
node 的域依次是
名a , 类型int
名n , 类型struct node*
node 是一个tag, 被隐式声明
其定义未知

也就是说, 2个 "node" 指的是不同的东西
3行隐式声明的是一个tag 叫 "node"
其定义未知, 为不完全类型
4行是将一个匿名的tag赋予别名 "node"



这tag根本就是个狗屁设计, 完全是迷惑人用的。

作者: OwnWaterloo   发布时间: 2010-07-01