类似
public class Test {public static void main(String args[]) {
byte[] b = new byte[1024];
short s = 0;
// 累加求和
for (int i = 4; i < 1022; i++) {
s += b[i];
}
b[1022] = (byte)((s >> 8) & 0xFF);
b[1023] = (byte)(s & 0xFF);
}
}
1 、定义数组,要给定其长度,也可以用Type a[ ] = {……} 的方式。
在对数组进行 *** 作时,可能需要计算数组长度,方法是:sizeof(数组名)/sizeof(元素类型)
2、指针指向的字符数组长度的获取方法,不能用sizeof,因为用sizeof(指针),得到指针长度为4
应该用strlen()函数。
#include <iostreamh>
#include <stringh>
int num(char ptr)
{
int bb = strlen(ptr);
return bb;
}
int main()
{
char p= new char[100];
p = "string";
int b = num(p);
cout<<b<<endl;
return 0;
}
使用eclipse默认的vm arguments,运行以下代码:
public static void main(String[] args) {
byte[] array=new byte[61858764];
// short[] shortArray=new short[30929382];
// int[] intArray=new int[15464691];
// long[] longArray=new long[7732345];
}
成功,没有报错,可知在eclipse默认的vm arguments下,byte数组的最大长度是61858764,将近60M。
由于short的长度比byte大一倍,所以short数组的最大长度是30929382,是byte数组最大长度的一半,
以此类推,int数组最大长度是15464691,long数组最大长度是7732345
我以为这就是最终结果,后来突然想起修改虚拟机的最大内存,也是这个结果吗?
我把eclipse的vm arguments设置修改为:-Xms256M -Xmx768M
再次测试代码,发现byte数组的最大长度可以更长,
通过Windows任务管理器可知,运行代码的javawexe进程占用的内存也更大(废话,呵呵)
到此为止,应该可以得出结论,通过修改虚拟机的最大内存,java整型数组的最大长度可以很长,但到底有多长?(肯定比内存小)
我试过定义一个byte数组的长度为618587640,将近600M,没有报错,更长的数组似乎没有意义,我也没有测试。
BYTE array[300]={01,02,05,20};
这样的定义,实际占用内存就是300,数组是不可变长度的内存占用,当声明后内存堆栈的占用是固定的。
至于4,是因为这样的定义后,默认除了前四个字节,后面的296字节默认补了0,那么按照字符串长度的方式计算,后面0不作为有效长度(虽然占用了内存),通过函数strlen取得的长度就是4个字节。
另外注意,数组的不安全性就在于,没有标准函数可以获取数组的实际占用内存长度,因此必须自己记录并限制内存地址 *** 作,否则很容易越界。
一个BYTE就是一个char,同样是一字节,楼上用sizeof(BYTE)得到的数字,只能是1
我做了个测试:
string msg = "我是我是我是我是我是";
Byte[] b = EncodingUnicodeGetBytes(msg);
MemoryStream ms = new MemoryStream(b);
byte[] buffer = new byte[4];
msRead(buffer, 0, (Int32)msLength);
// buffer = EncodingUnicodeGetBytes(msg);
string result = EncodingUnicodeGetString(buffer);
ConsoleWriteLine(result);
ConsoleReadLine();
这个代码就会报错,说数组超过大小。
但是你的那个代码为什么没报错呢因为数组是引用类型;
虽然你 开始 初始化了 长度为4;
但是你后来又写了 buffer= EncodingUnicodeGetBytes(msg);
右边这个是一个长度为20的字节数组,由于byte []是引用类型,他的数据是放在称为“堆”的内存区域中,所以指向了一个新的引用,即EncodingUnicodeGetBytes(msg); 所以即使长度变多了也不会报错。
以上就是关于byte数组的检验和全部的内容,包括:byte数组的检验和、怎么获得一个指向byte数组的指针、Java数组的长度到底能有多大等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)