C/C++,JAVA中的动态内存申请
摘 要: 本文总结了c/c++,java 中的动态内存申请用法;
关键词:c/c++,java,动态内存申请
1. 引 言
动态内存申请平时不怎么用,导致要用时一时手足无措,现总结如下;
2. C语言
C的动态内存申请是最基础的,当然也是最晦涩,最复杂的,这一切都要拜那个神奇的指针所赐。
2.1 三个表达式
int p1[][5];
int (*p2)[5];
int* p3[5];
以上三个表达式个代表什么意思呢?其实前两个是一样的,都是指一个指针,指向5个整形的一维数组,而第三个是一个指针数组,5个元素,每个元素是一个整形指针;当然如果你对指针和数组的概念充分熟悉的话,其实这三个也是“一样的”,想想
int a[5];
int* p;
p = a;
这个例子好了;
2.2 三个函数
贴上代码:
#include<stdio.h>
#include<stdlib.h>
const int R = 4;
const int C = 5;
int main() {
int** p;
int i=0, j=0;
p = (int**) malloc(sizeof(int*) * R);
for(i=0; i<R; ++i) {
p[i] = (int*)malloc(sizeof(int) *C);
}
/*
for(i=0; i<R; ++i) {
for(j=0; j<C; ++j) {
p[i][j] = 0;
}
}
*/
for(i=0; i<R; ++i) {
for(j=0; j<C; ++j) {
printf("%d/t",p[i][j]);
}
printf("/n");
}
for(i=0; i<R; ++i) {
free(p[i]);
}
free(p);
}
malloc对所分配的内存块不做任何事情,这个下面的calloc有区别,所以最好把我注释掉的那两层for放出来;
贴上代码:
#include<stdio.h>
#include<stdlib.h>
const int N = 4;
int main() {
int* p;
int i=0;
p = (int*) calloc(N, sizeof(int));
for(i=0; i<N; ++i) {
printf("%d/t",p[i]);
}
printf("/n");
free(p);
}
说明两点:
1. calloc出来的是有初始值的,如上面的都是0;
2. 其实
int* p = (int*) malloc(sizeof(int)*N);
for(int i=0; i<N: ++i) {
p[i] = 0;
}
就相当于:
int* p = (int*) calloc(N*sizeof(int));
可以参照下文c++中的delete;
3 C++
#include<iostream>
#include<iomanip>
using namespace std;
const int R = 4;
const int C = 5;
int main() {
int** p;
int i=0, j = 0;
p = new int* [R];
for(i=0; i<R; ++i) {
p[i] = new int[C];
}
for(i=0; i<R; ++i) {
for(j=0; j<C; ++j) {
p[i][j] = 0;
}
}
for(i=0; i<R; ++i) {
for(j=0; j<C; ++j) {
cout<<setw(5)<<p[i][j];
}
cout<<endl;
}
for(i=0; i<R; ++i)
delete[] p[i];
delete[] p;
}
转自《C++ primer》:动态分配数组时,如果数组元素具有类类型,将使用该类的默认构造函数实现初始化;如果数组元素是内置类型,则无初始化;
一定要delete,而且delete的顺序要和new出来的相反(构造和析构呀~~~)。
4 JAVA
Java最简单一步到位!
public class Main {
public static void main(String[] args) {
int[][] a = new int[4][5];
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 5; ++j) {
System.out.print(a[i][j]);
}
System.out.println();
}
}
}
5结论
本文给出了用c/c++,java语言进行程序设计时常用的动态内存申请方法,由本文可见,java在处理这类问题时确实有其简洁性,优越性。