请教C++下关于malloc()函数的问题2

来源:百度知道 编辑:UC知道 时间:2024/06/17 20:54:03
先给程序

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

int main()
{
int n=3;
int i;
int *pn=NULL;
pn=(int *)malloc(n*sizeof(int));

for(i=0;i<n;i++)
{
cout<<pn[i]<<endl;
}

getchar();
return 0;
}

问题:
1 用for循环输出语句时,为何可以以pn[i]的数组形式?
2 pn[]这个数组是什么时候创建的?
3 里面的内容是什么?
4 如果pn[]存在,数据类型是什么?
5 pn[]如何赋值?

谢谢~

1.
由于malloc分配的连续内存地址,正好同数组的结构一样.所以
(int *)malloc(n*sizeof(int))相当于申请了个int数组int pn[n].
这里等价于pn = new int[n],不过new除了分配内存之外,会调用对象的构造函数..
2. pn[]这个数组是malloc出来的. pn这个指针指向了malloc出来的数组.
3.malloc出的内存,内容是未知的..不可预测的(未初始化的).calloc函数则分配内容全部为0的连续内存.
4.malloc出的内存,本身是没有类型的(void*).但是没有类型的内存是不可用的.所以使用前需要把它解释成一种类型.比如这里是(int *)malloc...,也就是把malloc出的内存当作一块连续的整形数.(整形数组).pn[]就是一个整形数组.
5.pn的赋值同普通的数组赋值一样.pn[i]=XX;同样也不能越界.

malloc分配的内存最好调用free函数来释放.free(pn);

1,pn[i]就是*(pn+i)的意思,数组的用法基本上都可以搬到指针上面去。
2,pn是个动态数组,是在pn=(int *)malloc(n*sizeof(int)); 的时候创建的,这里直接是给pn分配空间
3,里面应该是未初始化的数组的内容,不同的编译器不同,也就都是你一个int数据声明后未赋值的值,可能是0(也有的是负N多)。
4,数据类型就是你定义的类型int *pn;pn是指针,指向int类型。
5,就直接用pn[3]=3;pn[4]=a;就可以赋值了。注意,在你未用free()销毁空间之前不要用类似int p=4; pn=&p;之类的语句直接给指针赋值,这样会导致内存泄漏!