【问题标题】:sbrk function and pointers in C programC程序中的sbrk函数和指针
【发布时间】:2015-07-09 04:47:58
【问题描述】:

代码:

typedef long Align;
union header {
        struct {
                union header *ptr;
                unsigned size;
        } s;
        Align x;
};

typedef union header Header;

................
................
................

static Header *morecore(unsigned nu)
{
        char *cp, *sbrk(int);
        Header *up;
        if (nu < NALLOC)
                nu = NALLOC;
        cp = sbrk(nu * sizeof(Header));
        if (cp == (char *) -1)
                return NULL;
        up = (Header *) cp;
        up->s.size = nu;
        free((void *)(up+1));
        return freep;
}

怀疑:

考虑 morecore 函数正在从其他函数调用,并从参数(nu)接收 4 作为 int。我对 以下陈述。

cp = sbrk(nu * sizeof(Header));
if (cp == (char *) -1)
        return NULL;
up = (Header *) cp;
up->s.size = nu;

up 只是一个指向 Header 的指针。但是,它仍然没有指向任何 Header 变量。 sbrk 分配请求的内存和 返回当前程序中断并将其存储在 cp 中。然后将存储在cp中的地址强制转换并分配给up。现在, up 包含 sbrk 作为指向 Header 变量的指针返回的地址。然后出现下面的语句,

up->s.size = nu;

up 只包含 sbrk 返回的地址。那么上面的语句如何将 nu 存储在 size 变量中。

【问题讨论】:

  • 这是在带有 4 位指针的 32 位操作系统上吗?
  • 是的。 “Linux ltsp63 3.2.0-33-generic #52-Ubuntu SMP Thu Oct 18 16:19:45 UTC 2012 i686 i686 i386 GNU/Linux”
  • 所以sbrk推送数据段,你得到程序最后一个break的地址,间隙为nu * sizeof(Header)。您将其转换为类型 Header 以取消引用以进行写入。现在问题是什么?许多*alloc 实现都使用这样的东西。
  • @mohanraj 你知道转换为Header * 不会改变存储在cp 中的信息,并且只允许将sbrk 返回的指针分配给up
  • 所有变量都只是一些内存位置。强制转换允许您将指向的内存解释为您喜欢的任何类型。实际上,您是在告诉编译器:“这是一些内存,我知道它指向这种类型的变量。让它如此”。这是 C 的力量之一,也是危险之一。

标签: c linux unix pointers sbrk


【解决方案1】:
// sbrk allocate "nu * sizeof(Header)" bytes at the address returned in cp.
cp = sbrk(nu * sizeof(Header));
// if cp is set to error return value (void *)-1 then cp is an invalid address.
if (cp == (char *) -1)
        return NULL;
// up is a pointer and its value is set to the new address (cp).
up = (Header *) cp;
// up is set to the new data allocated by sbrk in the memory. "->" will resolve the address in "up" and store the data.
up->s.size = nu;

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2011-01-07
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多