C语言动态内存分配的疑问
malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上
p1=(int *)malloc(10*sizeof(int))相当于生成了一个动态数组,其长度可待定。
p1是一个指向一连续内存块的指针。malloc申请时就相当于定义了一个指针,长度只是待定的,指针指向首地址。在一定长度下,这与数组的存储分配是一致的,因此可以像数组那样输入输出。
你的问题是刚刚学习指针的人都有的问题,需要从地址来认识这个问题,C语言的数据都是需要申请空间来存放的,有静态和动态两种,动态分配的空间大小可以按需要分配,并且可以回收,静态是不可以回收的。
首先,分配动态的空间,指针P和空间的首地址是没有直接的联系的,只是为了手续要使用这个刚刚分配的空间才让P指针指向这个刚刚分配的空间的首地址的话,如果还不理解,你可以反向想想如果你分配的这个空间,而不用P指针指向这个首地址,那么你如何使用这个空间呢?
void型是针对地址型的直接分配,为什么不是分配char的空间呢?因为C语言和硬件关系密切,
有写硬件他的地址不是8位存储的,是16位,或者是32位的,那么这个void就忽略了这个硬件地址宽位就分配100个地址就是了,然后,强制转换成char的8位,如果硬件是16位了,那么,每个地址就会多分配了8位,而使用前8为来存储空间了。
返回的指针是分配的100个地址的首地址,不是这个指针P,举个例子吧,空间可以看做是一个队伍,他本身就有一个领头的人,那么P就是一个单独的人,那么,我们如果像要找到这个队伍,需要先找到队伍的领头人,领头的人只在你申请的时候出现一次,后面,你就找不到他了,怎么办?你把他电话给P吧,P可以找到他。呵呵。
如果还是不理解,那就不要理解了,建议去吧队列的方式,用指针和动态分配内存的方式实现一次,就知道了,不能照着书本抄,全部代码要自己写出来,就肯定理解了。
1、你关于一维数组和指针是理解正确了,但二维(指针的指针)理解还不到位,需要再多看书。例如字符指针是 char *str 定义的,这是一维的指针,指针是变量,指针变量里面存储的是字符串的起始地址。而二维的指针,即指针的指针,是定义了又一个指针,指向的是指针变量,例如 char **str 的意思是:str变量是指针的指针,str变量存储的是一个指向字符串的指针变量的地址。要想直观理解,建议看书,书上一般会有内存示意图,非常直观。
2、sizeof是关键字,也可以说是运算符,不是函数,sizeof(int)即当前机器的int类型定义的大小,一般是在编译器内部用宏定义的,常用的是4字节。而sizeof(int *)是指的是一个指针变量的大小,其实是不要用int的,直接写sizeof(*)就表示指针大小,指针大小是不变(指针变量的大小在32位系统中是4字节,64位系统是8字节),即不依赖于指向的类型所以sizeof(int *)和sizeof(double *)都是一样的,编译器解析时会删除类型,直接变成sizeof(*),所以是一样的。
这个你一定是没有仔细看数
数据类型**表示定义的变量只能存放以“数据类型*”类型数据的地址
如 int ** p
表示p只能存放int *类型变量的地址
比如可以这样写
int *p;
int ** q=&p
这样的话你明白了吗
不明白加我
1203798698
九年级五班的张广耀祝你学习顺利
二维数组,比如说一个表,第一个维度是每一行的指针,这个指针指向的是 “指向这一行中每一个列元素” 的指针,所以是**,sizeof(int*)就是取指向int型变量的指针的大小。其实32位机中所有指针都是4字节,都写4就行了
数据类型后面两个取值运算符是和你的指针类型相匹配的,比如说:char *p = (char *)malloc...
表明这段内存是按你指针类型进行访问的,主要用在指针移位的时候,步长会按照你的指针类型来进行移位。
后面那个问题,sizeof(int *) ,只是代表一个指针大小。说明你分配一个指针大小的空间。
你的语句的意思就是分配一个指针大小的空间给一个指针的指针。
希望对你有帮助
C语言中的动态内存分配的用法举例
1、malloc函数:其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针。2、free函数:由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以当所分配的内存区域不用时,就要释放它,以...
动态分配内存动态分配内存的方法(C\/C++)
动态分配内存是程序设计中的一种重要技术,它允许程序在运行时根据实际需求动态地分配和释放内存空间。在C\/C++语言中,动态分配内存通常使用关键字new和delete来完成。新关键字new可以用于生成动态无名变量,例如`int *p=new int;`表示动态分配一个整型内存空间,并将首地址返回给指针p。同样,`int *p=ne...
C语言-动态分配内存 malloc & free
在一个函数中动态分配的内存,在另一个函数中操作这块内存 (1) MM是一个系统级的东西,所有的应用程序都向同一个MM申请内存。(2) 何为借出?实际上,在内存被借出时,MM只是把它管理的内存标记了一下,表示该段内存已经被占用。比如,它把每一段被占用的内存给记录下来(首地址,长度) (p0,n...
C语言动态存储分配问题
动态分配是位於切给程序用的那块内存之中.若用malloc取得空间而未用free释放, 只会影响到运行中的自己这个程序.Note2:所谓生存期是指宣告在函数中的变数自己所占的空间(位於stack中)而malloc所分配的空间是在heap之中.指针的生命期过了以後, 若之前所指的区域未free, 那块heap中的空间仍未回收.不过...
C语言问题:内存的分配方式有哪几种?
1、静态存储区分配 内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等。2、栈上分配 在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。3、堆上分配 堆分配(又称动态内存分配)。程序在运行时用malloc或者new申请内存,程序员...
C语言问题:内存的分配方式有哪几种?
内存分配方式有三种:[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,...
C语言:都是动态分配内存,malloc和new有什么区别?malloc分配的内存是...
(int *)malloc(sizeof (int) * 10);就是连续的,相当于数组,一个个创建就不是了,new可以给数据类型分配一个新结点并返回一个指向新分配内存区的首地址. 也可以对它进行初始化.中括号中的 size 可以分配尺寸大小.
C语言分配动态内存,分配的是否只能是连续的内存?
每一次分配的内存是连续的,但如果用结构体链表来管理分配的内存就可以将每一次分配的内存虚拟的连接起来 但前提是每一次分配的内存还是连续的,只是每个节点所占的内存单元不是连续的 -物联网校企联盟技术部
C学习:内存分配之malloc函数和alloca函数辨析
C语言内存管理中,malloc函数与alloca函数犹如两把不同的钥匙,它们在动态内存分配上各有千秋。本文将深入解析它们的异同点,并提供一些实用信息供进一步探索。首先,它们的共同点在于动态性和灵活性。malloc和alloca都允许根据程序运行时的需求动态地分配内存,它们的返回类型相同,都是返回指向分配内存的起始...
C语言 malloc 动态分配内存为什么叫动态分配内存?感觉它分配的时候还...
动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。从以上动、静态内存分配比较可以知道动态内存分配相对于静态内存分配的特点:1、不需要...
阎腾芩胆: 要实现动态内存的分配,除了利用含指针成员的结构体之外,还需利用C语言提供的几个标准库函数.(使用时应包含头文件“alloc.h”或“malloc.h”或“stdlib.h”)1.malloc函数 函数原型为void *malloc(unsigned int size);在内存的动态存储...
花溪区17647298357: C语言中动态分配内存问题 - ?
阎腾芩胆: #include void px(int *k,int len);//函数声明 int main() {int i,n,x,*p,*q;printf("请输入动态数组长度n\n");scanf("%d",&n);printf("请输入%d个数组元素\n",n);q = p = (int*)malloc(n*sizeof(int));//申请动态数组for(i=0; i {...
花溪区17647298357: 谁可以分析一下下面这段话中的C语言中的内存动态分配问题. - ?
阎腾芩胆: 虽然你传入的参数是0,但实际上malloc仍然会为你分配一块4字节的内存(不同编译器可能有不同大小).就比如你malloc(1),其实得到的内存块大小跟malloc(2)是一样的,这是由内存分配算法决定的.这么做的原因其实很简单:大部分程序碰到malloc返回NULL的时候,都会认为内存不足,从而去开辟一个新堆或者直接就进入错误处理函数了.为了避免应用程序误判,malloc只要有内存,就一定会返回一个有效指针.至于为什么是4字节,简单地说是因为考虑到内存分配算法和内存访问效率.这块牵涉到算法和一些硬件方面的知识,你有兴趣的话可以自己去看为什么.
花溪区17647298357: c语言的动态内存分配问题 - ?
阎腾芩胆: 这不管是第一段代码还是第二段代码中,a[2]都发生了数组下标越界的问题,不过对于有些编译器在编译时比较严格,有些不严格,所以有些会报错,有些不会
花溪区17647298357: C语言,动态内存分配问题. - ?
阎腾芩胆: 按字符串的处理方式即可,写个程序做个示范吧:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15#include<stdio.h> #include<malloc.h> intmain() {intn;char*pstr1;printf("请输入字符个数:");scanf("%d",&n);pstr1=(char*)malloc(n*sizeof(char));...
花溪区17647298357: C语言 内存预分配的问题 - ?
阎腾芩胆: #include <stdio.h> #include <string.h> #include <malloc.h>#define MBKSIZE 1024typedef struct test {int num;char str[500]; } MTEST;typedef struct mem {char *mblock;int size;int used; } MEM;MEM mb;void initmem(void) {mb.mblock=(...
花溪区17647298357: C语言动态内存分配问题 - ?
阎腾芩胆: void GetMemory(char **p, int num){ *p=(char*)malloc(sizeof(char)*num); }//<----- int main() {char *p = NULL; GetMemory(&p,100);//<---------- strcpy(p,”Hello World”); printf(“%s\n”,p); return 0;}
花溪区17647298357: 关于C语言动态内存分配失败的问题 - ?
阎腾芩胆: scanf("%d", &m, &n); //你输入m和n的时候只输入了m,n是个随机值,大多数情况下这个值很大,m*n是个很巨大的数字,导致没那么多内存分配 scanf("%d%d", &m, &n); //都输入
花溪区17647298357: C语言中动态内存分配的问题 int * p=(int*)malloc(8) 这样理解对不对:(in - ?
阎腾芩胆: (int*)表示将动态分配的8个字节的内存空间类型强制转换为 "1" 个指向int的指针类型 另外上述代码的写法既无可读性,也无可移植性 int * p=(int*)malloc(2*sizeof(int));
花溪区17647298357: c语言动态分配空间问题 - ?
阎腾芩胆: #include <stdio.h>#include <malloc.h> int main(){ int *a, n, i; printf("请输入学生人数:"); scanf("%d",&n); a = (int *)malloc(sizeof(int)*n); //动态分配内存,根据n分配 for(i=0; i<n; i++){ printf("请输入学号为%d的学生成绩:",i+1); scanf("%d",&a[i]); } for(i=0; i<n; i++){ printf("学号:%d\t成绩:%d\n",i+1,a[i]); } return 0; }