在C语言里面声明指针并用malloc赋值与与直接声明变量并获取其指针有何区别?
比如说Link是链表结构体,那Linkn;&n与Link*n,n=malloc(sizeof(Link))有无区别?请各位再看一下问题补充,不需要回答什么堆或者栈的详细内...
比如说Link是链表结构体,
那Link n; &n
与Link *n, n=malloc(sizeof(Link))有无区别?
请各位再看一下问题补充,不需要回答什么堆或者栈的详细内部实现,只需要说对于初级程序员来说,假如只需要做一般的链表创建、插入、删除操作,两者的运行效果上有无区别,如果有,有何区别?
根据对追问的回答来采纳! 展开
那Link n; &n
与Link *n, n=malloc(sizeof(Link))有无区别?
请各位再看一下问题补充,不需要回答什么堆或者栈的详细内部实现,只需要说对于初级程序员来说,假如只需要做一般的链表创建、插入、删除操作,两者的运行效果上有无区别,如果有,有何区别?
根据对追问的回答来采纳! 展开
6个回答
展开全部
区别是有的,直接声明的变量存储在连续的内存区域上,比如char a[5];char b[5];你可以用gets(a)输入10个字符;使用malloc分配的内存区域不一定是连续(很大程度上不是连续的),他们是一块一块的内存区域,使用链表联系在一起。
直接声明的变量储存的区域叫做 栈(stack),使用malloc获得的区域叫堆(heap)。
栈是连续高速而小的(1M,2M的都有,一般不超过2M),堆是不连续低速但容量极大的。
直接声明的变量储存的区域叫做 栈(stack),使用malloc获得的区域叫堆(heap)。
栈是连续高速而小的(1M,2M的都有,一般不超过2M),堆是不连续低速但容量极大的。
追问
对初学者来说,如果只看很基本的插入、删除等操作,程序运行结果上有无区别?
追答
如果是链表的操作的话,那么没有任何区别,因为一个节点里面有指向下一个节点的地址,只要有这个地址,就能确定一个内存区域。
struct linklist
{
...//数据
struct linklist *pNext;//这个用于指向下一个结构体,不需要数组一样的连续内存区域
}
展开全部
当然有了。
Link
{
Link *next;//指向下个节点
Elem e;//元素
}
Link n;就是创建一个Link的结构体,这个变量叫做n。&n表示Link结构体n的首地址。
但是因为Link是链表,里面有个成员是指向一个结构体的指针。所以要用malloc分配空间,而malloc(sizeof(Link));就是为这个地址分配一个可用的堆空间。
你可以开始定义一个 Link L;但是L.next是指针,还是要用malloc为其分配空间。
因为这样是不行。这样定的话会是一个死递归,是非法的。
Link
{
Link next;
Elem e;//元素
}
Link
{
Link *next;//指向下个节点
Elem e;//元素
}
Link n;就是创建一个Link的结构体,这个变量叫做n。&n表示Link结构体n的首地址。
但是因为Link是链表,里面有个成员是指向一个结构体的指针。所以要用malloc分配空间,而malloc(sizeof(Link));就是为这个地址分配一个可用的堆空间。
你可以开始定义一个 Link L;但是L.next是指针,还是要用malloc为其分配空间。
因为这样是不行。这样定的话会是一个死递归,是非法的。
Link
{
Link next;
Elem e;//元素
}
更多追问追答
追问
我试过不需要再分配都可以用next。
追答
那是一个地址,但是没有空间。如果不用malloc你试试:
Link l;
l.next->e根本放不进去东西的,程序会退出的。l.next是在Link l;时就分配好的指针变量,地址还没确定呢。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
区别在于&n是个局部静态的指针,是在栈中。malloc分配的是动态的,分配在堆区中。
C程序中编译后的程序在加载后,栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。如果你在一个函数中一下子分配一个很大的数据,就可能导致栈溢出。
另外malloc用于分配大小不固定的链表,使用变量静态分配的不够灵活。
C程序中编译后的程序在加载后,栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。如果你在一个函数中一下子分配一个很大的数据,就可能导致栈溢出。
另外malloc用于分配大小不固定的链表,使用变量静态分配的不够灵活。
更多追问追答
追问
对初学者来说,如果只看很基本的插入、删除等操作,程序运行结果上有无区别?
追答
在结果上无区别。只是写代码的时候一个用“->”访问结构体内成员,一个用"."访问结构体内成员。除非对直接声明变量获取的指针再复制给一个指针变量。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先你得明白malloc函数的作用;malloc函数是在内存中找到一个合适大小的内存空间来存储数据,并让指针指向这个空间的首地址。它的意义是在创建数组时,可以创建动态数组。
比如 int a[n],*p;p=a;是不合法的。而int *p;p=(int *)malloc(n*sizeof(int))却可以实现创建这样一个长度为n的数组
比如 int a[n],*p;p=a;是不合法的。而int *p;p=(int *)malloc(n*sizeof(int))却可以实现创建这样一个长度为n的数组
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
区别当然是有的
Link n; 申明结构体实体
&n 结构体地址
Link *n; 申明结构体指针
n=malloc(sizeof(Link)); 让结构体指针指向申请的内存空间,需要free释放
后者需要释放并且申请大小灵活
希望对你有帮助
Link n; 申明结构体实体
&n 结构体地址
Link *n; 申明结构体指针
n=malloc(sizeof(Link)); 让结构体指针指向申请的内存空间,需要free释放
后者需要释放并且申请大小灵活
希望对你有帮助
追问
要用malloc,多个函数反而还更灵活了?是更复杂了吧!
追答
是分配的时候更灵活了,当然可以理解为使用更复杂
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询