C语言动态内存分配的疑问

在C语言中,动态内存分配是这样的。 int *pival=(int*)malloc(sizeof(int)) 上述语句是在内存中声明了一个指针变量pival,其中(int*)表示该段内存空间的数据类型指向整形,sizeof(int)表示长度为四个字节,malloc(sizeof(int))表示配置了一段四个字节的内存空间.可以这样解释吧?如果以上我说的正确的话。 那么动态分配二维数组的第一维度则是这样的。 数据类型 **指针变量=(数据类型**)malloc(sizeof(int*)) 其中,数据类型后面的存取运算符为什么有两个呢? sizeof(int*)中为什么要加一个星号,这个到底是为什么,区别在哪,如果不加会怎么样。

这样解释:
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(*),所以是一样的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-14
这个你一定是没有仔细看数
数据类型**表示定义的变量只能存放以“数据类型*”类型数据的地址
如 int ** p
表示p只能存放int *类型变量的地址
比如可以这样写
int *p;
int ** q=&p
这样的话你明白了吗
不明白加我
1203798698
九年级五班的张广耀祝你学习顺利
第2个回答  2011-08-14
二维数组,比如说一个表,第一个维度是每一行的指针,这个指针指向的是 “指向这一行中每一个列元素” 的指针,所以是**,sizeof(int*)就是取指向int型变量的指针的大小。其实32位机中所有指针都是4字节,都写4就行了
第3个回答  2011-08-15
数据类型后面两个取值运算符是和你的指针类型相匹配的,比如说:char *p = (char *)malloc...
表明这段内存是按你指针类型进行访问的,主要用在指针移位的时候,步长会按照你的指针类型来进行移位。

后面那个问题,sizeof(int *) ,只是代表一个指针大小。说明你分配一个指针大小的空间。

你的语句的意思就是分配一个指针大小的空间给一个指针的指针。

希望对你有帮助
相似回答