为什么在声明结构指针时需要分配内存
struct A{
///
};
int main(void)
{
struct A *var=(struct A*)malloc(sizeof(struct A));
//
//
}
但是当我们声明一个结构变量时,我们不需要分配任何内存吗?
struct A var;
答案 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.