C语言动态内存函数分配问题
教材上说明了malloc函数的用法,但是我不太理解。如:char*pp=(char*)malloc(100)以这个函数为例,首先声明了指针P,然後分配内存。但是我不明白的...
教材上说明了malloc函数的用法,但是我不太理解。
如:
char *p
p=(char*)malloc(100)
以这个函数为例,首先声明了指针P,然後分配内存。但是我不明白的地方是:
这里分配的内存是给指针p,还是p所指向的变量?
关於返回值,这个函数将返回一个void型的指针变量,这是什麽意思?返回的这个指针是指p,还是其他的指针?
返回的指针,其存储空间(地址)又在哪里?是本身的这块内存,还是其他地址的内存空间?
这里的强制转换(char*)是什麽意思?
希望能得到前辈们的帮助,谢谢! 展开
如:
char *p
p=(char*)malloc(100)
以这个函数为例,首先声明了指针P,然後分配内存。但是我不明白的地方是:
这里分配的内存是给指针p,还是p所指向的变量?
关於返回值,这个函数将返回一个void型的指针变量,这是什麽意思?返回的这个指针是指p,还是其他的指针?
返回的指针,其存储空间(地址)又在哪里?是本身的这块内存,还是其他地址的内存空间?
这里的强制转换(char*)是什麽意思?
希望能得到前辈们的帮助,谢谢! 展开
5个回答
展开全部
你的问题是刚刚学习指针的人都有的问题,需要从地址来认识这个问题,C语言的数据都是需要申请空间来存放的,有静态和动态两种,动态分配的空间大小可以按需要分配,并且可以回收,静态是不可以回收的。
首先,分配动态的空间,指针P和空间的首地址是没有直接的联系的,只是为了手续要使用这个刚刚分配的空间才让P指针指向这个刚刚分配的空间的首地址的话,如果还不理解,你可以反向想想如果你分配的这个空间,而不用P指针指向这个首地址,那么你如何使用这个空间呢?
void型是针对地址型的直接分配,为什么不是分配char的空间呢?因为C语言和硬件关系密切,
有写硬件他的地址不是8位存储的,是16位,或者是32位的,那么这个void就忽略了这个硬件地址宽位就分配100个地址就是了,然后,强制转换成char的8位,如果硬件是16位了,那么,每个地址就会多分配了8位,而使用前8为来存储空间了。
返回的指针是分配的100个地址的首地址,不是这个指针P,举个例子吧,空间可以看做是一个队伍,他本身就有一个领头的人,那么P就是一个单独的人,那么,我们如果像要找到这个队伍,需要先找到队伍的领头人,领头的人只在你申请的时候出现一次,后面,你就找不到他了,怎么办?你把他电话给P吧,P可以找到他。呵呵。
如果还是不理解,那就不要理解了,建议去吧队列的方式,用指针和动态分配内存的方式实现一次,就知道了,不能照着书本抄,全部代码要自己写出来,就肯定理解了。
首先,分配动态的空间,指针P和空间的首地址是没有直接的联系的,只是为了手续要使用这个刚刚分配的空间才让P指针指向这个刚刚分配的空间的首地址的话,如果还不理解,你可以反向想想如果你分配的这个空间,而不用P指针指向这个首地址,那么你如何使用这个空间呢?
void型是针对地址型的直接分配,为什么不是分配char的空间呢?因为C语言和硬件关系密切,
有写硬件他的地址不是8位存储的,是16位,或者是32位的,那么这个void就忽略了这个硬件地址宽位就分配100个地址就是了,然后,强制转换成char的8位,如果硬件是16位了,那么,每个地址就会多分配了8位,而使用前8为来存储空间了。
返回的指针是分配的100个地址的首地址,不是这个指针P,举个例子吧,空间可以看做是一个队伍,他本身就有一个领头的人,那么P就是一个单独的人,那么,我们如果像要找到这个队伍,需要先找到队伍的领头人,领头的人只在你申请的时候出现一次,后面,你就找不到他了,怎么办?你把他电话给P吧,P可以找到他。呵呵。
如果还是不理解,那就不要理解了,建议去吧队列的方式,用指针和动态分配内存的方式实现一次,就知道了,不能照着书本抄,全部代码要自己写出来,就肯定理解了。
展开全部
这里分配的内存是给指针p,还是p所指向的变量?
答:这里分配的是p所指向的内存空间,即你所说的“变量”。
关於返回值,这个函数将返回一个void型的指针变量,这是什麽意思?
答:返回void类型的指针,就是为了方便调用它的人能方便把改指针转化为自己所需要的指针,因为你永远不知道调用者希望什么样的操作。比如
INT8S a[2];
INT16S b;
VOID *p;
p = &b;
a = (INT8S *)p; //在此处,void *p只是起到一个临时储蓄罐的作用而已。
返回的这个指针是指p,还是其他的指针?
答:返回的是一个地址,然后把地址放到p所指向的地址处。p是一个变量。
返回的指针,其存储空间(地址)又在哪里?是本身的这块内存,还是其他地址的内存空间?
这里的强制转换(char*)是什麽意思?
答:上面已经有所涉及,不重复说了。返回的是一个地址,对应用开发而已,其地址是由操作系统提供的,如果你会调试操作系统,就会知道地址在哪里,通常这是没必要的,因为不同操作系统分配的地址可能不一样,不同时刻不同调用,地址又可能不一样……如果你真的想自己控制该地址的话,可以学习黑客技术,要么“欢迎加入嵌入式开发”……
答:这里分配的是p所指向的内存空间,即你所说的“变量”。
关於返回值,这个函数将返回一个void型的指针变量,这是什麽意思?
答:返回void类型的指针,就是为了方便调用它的人能方便把改指针转化为自己所需要的指针,因为你永远不知道调用者希望什么样的操作。比如
INT8S a[2];
INT16S b;
VOID *p;
p = &b;
a = (INT8S *)p; //在此处,void *p只是起到一个临时储蓄罐的作用而已。
返回的这个指针是指p,还是其他的指针?
答:返回的是一个地址,然后把地址放到p所指向的地址处。p是一个变量。
返回的指针,其存储空间(地址)又在哪里?是本身的这块内存,还是其他地址的内存空间?
这里的强制转换(char*)是什麽意思?
答:上面已经有所涉及,不重复说了。返回的是一个地址,对应用开发而已,其地址是由操作系统提供的,如果你会调试操作系统,就会知道地址在哪里,通常这是没必要的,因为不同操作系统分配的地址可能不一样,不同时刻不同调用,地址又可能不一样……如果你真的想自己控制该地址的话,可以学习黑客技术,要么“欢迎加入嵌入式开发”……
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1,这里分配的内存是给指针p,还是p所指向的变量?
指针就是一个变量,一个用来存储地址的变量。指针自身的大小是固定的(在同一环境中),比如你可以这样验证:char *p;prntf("%d \n", sizeof(p));这里malloc分配的是100个字节的大小,是p指向的一块内存。
2,关於返回值,这个函数将返回一个void型的指针变量,这是什麽意思?返回的这个指针是指p,还是其他的指针?
void可以简单理解为通用的指针类型,可以转化为任何其他指针类型,返回的这个指针是指p,还是其他的指针?返回的是一块内存地址,赋值给p。
3,返回的指针,其存储空间(地址)又在哪里?是本身的这块内存,还是其他地址的内存空间?
这里的强制转换(char*)是什麽意思?
指针本身是变量,所以指针本身也是占内存空间的,你要看p本身的地址,可以char *p; printf("%p \n", p);验证。这里的强制转换(char*)是什麽意思?在标准C里是不需要强转的,C++需要,为保证程序可移植性,还是转换下。
指针就是一个变量,一个用来存储地址的变量。指针自身的大小是固定的(在同一环境中),比如你可以这样验证:char *p;prntf("%d \n", sizeof(p));这里malloc分配的是100个字节的大小,是p指向的一块内存。
2,关於返回值,这个函数将返回一个void型的指针变量,这是什麽意思?返回的这个指针是指p,还是其他的指针?
void可以简单理解为通用的指针类型,可以转化为任何其他指针类型,返回的这个指针是指p,还是其他的指针?返回的是一块内存地址,赋值给p。
3,返回的指针,其存储空间(地址)又在哪里?是本身的这块内存,还是其他地址的内存空间?
这里的强制转换(char*)是什麽意思?
指针本身是变量,所以指针本身也是占内存空间的,你要看p本身的地址,可以char *p; printf("%p \n", p);验证。这里的强制转换(char*)是什麽意思?在标准C里是不需要强转的,C++需要,为保证程序可移植性,还是转换下。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在内存中开辟了 一片空间 100个字节,然后 p里边存的是 这100个字节的首地址
至于为什么 (char *)为了跟 p的类型符合啊
malloc是 开辟一片空间 返回首地址的一个函数
至于为什么 (char *)为了跟 p的类型符合啊
malloc是 开辟一片空间 返回首地址的一个函数
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
分配大小为100的内存,内存首地址给p
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询