为结构指针分配内存

时间:2019-05-06 03:13:23

标签: c pointers structure

为什么在声明结构指针时需要分配内存

struct A{
///
};
int main(void)
{
    struct A *var=(struct A*)malloc(sizeof(struct A));
//
//
}

但是当我们声明一个结构变量时,我们不需要分配任何内存吗?

struct A var;

3 个答案:

答案 0 :(得分:2)

对于任何指针(不仅是结构指针)都是如此。原因是,当您声明一个变量(类型为int,char或某些struct A的类型)时,您告诉编译器创建一个新的变量/实例。因此,编译器会自动为该变量分配内存。但是,当您声明指向某个int或某个struct A的指针时,实际上是在告诉编译器您需要引用某个变量,而不是完全引用该类型的新变量。为了说明这一点:

function getIndexTraverse(id, $defer, params) {

    // index and paginate
    if(typeof id !== 'object')
    {
        var page        = params.page();
        var count       = params.count();
    }

    // search and filter
    var data        = id;

    if(typeof page !== 'undefined')
    {
        // index and paginate
        var parameter = {
            'page'       : page,
            'count'      : count,
            'id'         : id
        }

        var url = '/traverse/users?page=' + page;
    }
    // search and filter
    else 
    {
        data.new.id = data.id;

        var parameter       =  data.new;
        var url             = '/traverse/users';
    }

现在,如果仅声明一个指针A * p,则此处p不引用任何内容。因此,如果要p引用结构A的新实例,则必须显式编写:

    $http({
        url     : 'api/users/' + id + url,
        method  : 'GET',
        params  : {passed: parameter}

    }).then(function (usersData) {

        var orderedData = params.sorting() ? $filter('orderBy') 
          (usersData.data.users.data, params.orderBy()) : 
          usersData.data.users.data;

        orderedData     = params.filter()  ? $filter('filter') 
        (orderedData, params.filter()) : usersData.data.users.data;

        params.total(usersData.data.users.total);
        $defer.resolve(orderedData);
   })
}

答案 1 :(得分:1)

在声明指针时(不一定可以指向同一类型的任何现有对象),不必必须分配内存,但是为了使用指针而不会引起未定义的行为,必须指向该类型的对象。由于指针在数据结构中被广泛使用,因此分配的对象经常是最常指向的对象,这就是为什么似乎必须分配内存的原因。

答案 2 :(得分:0)

  • struct A var declares a variable var on stack area of main memory with internal structure as declared in the struct A.

  • struct A * var also declares a variable var on stack area of main memory but the var is a pointer now, and as you may know, a pointer in C is used to store address of a variable, so the var need to know what is the address, the statment (struct A*)malloc(sizeof(struct A)); gives you the address.