初学者求教,如何测量动态分配的内存长度,以及如果用malloc创建的数组,怎样测量数组长度

问题描述

初学者求教,如何测量动态分配的内存长度,以及如果用malloc创建的数组,怎样测量数组长度
初学者求教,如何测量动态分配的内存长度,以及如果用malloc创建的数组,怎样测量数组长度

解决方案

楼主首先要明白一点就是数组是自定义类型。
c/c++的三种自定义类型:1.指针;2.结构体/联合(包括位域);3.数组

既然你是动态分配的,那么sizeof如何能强大到侦探你的动态的情况呢?
malloc是个函数,原型为extern void *malloc(unsigned int num_bytes),
参数是要分配的字节数,返回时void型指针也就是分配内存的首地址,同时分配的内存是在堆区(heep),用完需要自己释放,否则内存泄露。
既然返回是指针类型,那么sizeof(指针) === 4

其实malloc很好用的,比如要分配一维数组 int a[4] 的存储空间
int p = (int)malloc(sizeof(int) * 4)
使用公式是
ELEMENT_TYPE *p = (ELEMENT_TYPE *)malloc(sizeof(ELEMENT_TYPE ) * ELEMENT_NUMBER)
既然是动态分配那么ELEMENT_NUMBER就不是magic_number可以用个变量来保存

解决方案二:
试一试就知道了

 #include <stdio.h>int main(){    int * a = (int *)malloc(100);    printf(""%d"" sizeof(a));}

输出4
http://codepad.org/QtENshgL)

所以“sizeof(数组) / sizeof(数组类型)”是错误的。

解决方案三:
C语言没法测量数组的长度。所以字符串才需要用一个作为结束标志。

解决方案四:
sizeof(数组) / sizeof(数组类型)应该可以把。

解决方案五:
动态数组不能测得长度,只能是开始创建时就记录它的长度,并且,不能查找结束符,因为很多情况下必须先将数组的整个内存的每个字节全部设为,然后再填充数据,否则的话,数组中将可能会有额外数据

解决方案六:
int a[10]int length = sizeof(a)/sizeof(a[0])。这样便可以测量数组的长度了。

解决方案七:
windows下可以用_msize获得指针指向区域的大小
函数原型 size_t _msize( void *memblock );

帖子最后还有其他方法:

http://bbs.csdn.net/topics/391004994

解决方案八:
直接用创建时的长度不就行了吗

解决方案九:
使用malloc或者calloc来动态分配内存;
calloc(nmembsize)用来配置 nmemb 个相邻的内存单位, 每一单位的大小为size,
malloc(size)size就为分配的大小,内存单位与系统有关,
测量malloc分配的大小长度为size*系统单元长度

解决方案十:
使用malloc或者calloc来动态分配内存;
calloc(nmembsize)用来配置 nmemb 个相邻的内存单位, 每一单位的大小为size,
malloc(size)size就为分配的大小,内存单位与系统有关,
测量malloc分配的大小长度为size*系统单元长度

时间: 2024-08-03 21:52:30

初学者求教,如何测量动态分配的内存长度,以及如果用malloc创建的数组,怎样测量数组长度的相关文章

c++-初学者求教,关于数组分配内存的问题

问题描述 初学者求教,关于数组分配内存的问题 在c++中对于string这样的类类型,因为字符长度可变,在数组中怎样分配内存空间??? 解决方案 存的是string的指针,他只想实际字符串地址 解决方案二: 字符串分配内存,一般可以用动态分配.但是还要看你的具体要求 解决方案三: string是长度固定的,怎么叫可变? 字符串的相加.赋值等等都会产生一个新的字符串对象. 解决方案四: 动态分配,当空间不够了,就分配一块更大的空间,拷贝内容,删除原来的空间 解决方案五: string类型是一个对字

初学者求教,c++中new如何分配数组内存

问题描述 初学者求教,c++中new如何分配数组内存 c++中使用new定义动态数组时,如果数组大小已知,那么会如何分配内存?是在程序运行时按照使用的元素数分配还是按照数组大小一次性分配(和普通数组一样的方式) 解决方案 也是一次性分配,你可以自己测试下,申请完,看它的大小 解决方案二: C++ new内存分配 解决方案三: 运行时肯定已经知道数组的大小了,数组多大就分配多大的内存. 解决方案四: 都可以的. 如果要分配的大小比较大的话,建议用new new还需要你delete,是在堆分配空间

c语言-初学者求教 关于数组过大的问题

问题描述 初学者求教 关于数组过大的问题 如果定义的数组过大,编译器不通过,以前知道动态分配内存,或者修改内存模式解决今天突然看到一个程序,直接把数组定义成全局数组,便ok了 why?#includeint c[1001][1001];int main(){ int nmij; char a[1001]b[1001]; scanf(""%d %d""&n&m); scanf(""%s""a); scanf(&q

java-Java GC会释放在c++中动态分配的内存吗

问题描述 Java GC会释放在c++中动态分配的内存吗 最近在使用JNA技术,在c++中动态分配了内存,然后传递给了java现在想问一下java垃圾回收机制会回收c++分配的内存吗? 解决方案 当然不会啦. 解决方案二: C++的内存需要自己代码来进行控制,不能被java GC来处理. 解决方案三: jdk的手伸不了那么远,垃圾回收的机制也不一样. 解决方案四: 谁开辟的内存谁去清理, 这是本分, 不要想着别人去给你清理, 即使会,这也不合乎情理

初学者求教,C++中在类内声明一个struct和另一个类,在类外怎么定义

问题描述 初学者求教,C++中在类内声明一个struct和另一个类,在类外怎么定义 template class List{ struct Node{}; ... class const_iterator{}; class iterator:public const_iterator{}; ... }; struct Node{ Object data; ... }; 这样定义出现了错误,但不知如何解决.并且模板Object在struct Node为何无法使用? 解决方案 类中定义一个stati

java-Java初学者求教,麻烦了

问题描述 Java初学者求教,麻烦了 package cn.xtgj.dao; import java.util.Iterator; import java.util.Scanner; import java.util.TreeSet; import cn.xtgj.model.Wares; public class Dao { Scanner sc=new Scanner(System.in); String option; TreeSet set=new TreeSet();//此集合用来装

java初学者求教:关于线程安全问题

问题描述 java初学者求教:关于线程安全问题 List list = new ArrayList(); list = Collections.synchronizedList(list); 这时list是线程安全的,那么当我用增强for循环遍历list, 并且使用list的remove方法时,是不是就不安全了? 另外,如果list集合中存放的是一些带有图片的对象,比如dog public void paintTest(Graphisc g){ for(dog d:list){ g.drawIm

java-Java中定义数组必须要指定长度吗,如果是为什么?

问题描述 Java中定义数组必须要指定长度吗,如果是为什么? Java中定义数组必须要指定长度吗,如果是为什么?今天写程序时,前面定义了一个数组是空的int[] a ={};但是在下面用a[i]循环赋值时会出现 java.lang.ArrayIndexOutOfBoundsException错误,当我用int[] a = new int[8];这种形式就不会出现这种错误,这是什么原因,求回答啊 解决方案 Java中的数组是定长的!你这样int[] a ={}; 定义出来的数组a 长度为0,已经是

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_   #include<stdio.h> #include<stdlib.h>   /************************************************************************/ /*数组的结构体类型                                                    */ /***************