作者在 2011-09-07 14:58:26 发布以下内容
/*
时间:2011年9月7日14:26:51
备注:动态内存分配,需要使用malloc函数,malloc是memory(内存)+allocate(分配)的缩写
*/
# include <stdio.h>
# include <malloc.h> //必须有,否则报错error C2065: 'malloc' : undeclared identifier
int main (void)
{
int i= 5; //静态分配,分配了4个字节
int * p = (int*) malloc (4);
/*
1. 要使用malloc函数,必须添加malloc.h头文件
2. malloc函数只有一个形参,并且是整数类型(int或long int)
3. (int*) malloc (4)中的 形参 4,表示请求系统为本程序分配4个字节
4. malloc函数只能返回第一个字节的地址
5. (int*) malloc (4)中的(int*),是在做强制类型转换,将返回的 4个字节中的第一个字节地址 强制转化为 int变量的地址
这样一来,虽然返回的只有一个字节地址,但系统会知道,分配的4个字节是同一个整形变量的地址
所以 p 指向了4个字节,但p 里实际只保存了 4个字节中首个字节的地址,于是动态分配了4个字节
6. 上面这行代码到底分配了几个字节地址?答案,8个。动态分配了4个字节,但别忘了指针变量p还被静态分配了4个字节
*/
*p = 5; //*p代表着一个整形变量,只不过*p这个整形变量的内存分配方式和i变量的不同。
printf("i=%d,*p=%d\n",i,*p); //输出结果 i=5,*p=5
free(p); //表示把p所指向的内存给释放掉,p本身的内存是静态的,不能由程序员手动释放,只能在p变量所在的函数运行终止时,由系统释放
printf("i=%d,*p=%d\n",i,*p); //释放后的输出结果 i=5,*p=-572662307
return 0;
}
时间:2011年9月7日14:26:51
备注:动态内存分配,需要使用malloc函数,malloc是memory(内存)+allocate(分配)的缩写
*/
# include <stdio.h>
# include <malloc.h> //必须有,否则报错error C2065: 'malloc' : undeclared identifier
int main (void)
{
int i= 5; //静态分配,分配了4个字节
int * p = (int*) malloc (4);
/*
1. 要使用malloc函数,必须添加malloc.h头文件
2. malloc函数只有一个形参,并且是整数类型(int或long int)
3. (int*) malloc (4)中的 形参 4,表示请求系统为本程序分配4个字节
4. malloc函数只能返回第一个字节的地址
5. (int*) malloc (4)中的(int*),是在做强制类型转换,将返回的 4个字节中的第一个字节地址 强制转化为 int变量的地址
这样一来,虽然返回的只有一个字节地址,但系统会知道,分配的4个字节是同一个整形变量的地址
所以 p 指向了4个字节,但p 里实际只保存了 4个字节中首个字节的地址,于是动态分配了4个字节
6. 上面这行代码到底分配了几个字节地址?答案,8个。动态分配了4个字节,但别忘了指针变量p还被静态分配了4个字节
*/
*p = 5; //*p代表着一个整形变量,只不过*p这个整形变量的内存分配方式和i变量的不同。
printf("i=%d,*p=%d\n",i,*p); //输出结果 i=5,*p=5
free(p); //表示把p所指向的内存给释放掉,p本身的内存是静态的,不能由程序员手动释放,只能在p变量所在的函数运行终止时,由系统释放
printf("i=%d,*p=%d\n",i,*p); //释放后的输出结果 i=5,*p=-572662307
return 0;
}
第2个例子
/*时间:2011年9月7日15:16:32*/
# include <stdio.h>
# include <malloc.h>
void f(int * q) //形参q相当于,p的拷贝
{
//q = 88; //这样写不对,因为q是int *的,不能用整形常量给他赋值,会报错error C2440: '=' : cannot convert from 'const int' to 'int *'
//**q = 88; //这样写也不对,**q表示以*q为地址的变量,但*q是整形变量,不是能做地址。会报错error C2100: illegal indirection
*q = 88; //q与p指向的地址相同,所以*q和*p代表的是相同的变量,在f函数里为*q赋值,main函数中的*q的值会变化
//free(q); //不可以释放q指向的地址,因为这个地址就是main函数中p指向的地址,在这里释放会造成 输出发生错误 *p=-572662307
}
int main(void)
{
int * p = (int *)malloc(sizeof(int)); //(sizeof(int) 是int型变量所占的字节数
*p = 5;
printf("*p=%d\n",*p); //输出 *p = 5
f(p); //实参p 是int* 型的,所以函数形参也需定义为int *型
printf("*p=%d\n",*p); //输出*p = 88
return 0;
}
# include <stdio.h>
# include <malloc.h>
void f(int * q) //形参q相当于,p的拷贝
{
//q = 88; //这样写不对,因为q是int *的,不能用整形常量给他赋值,会报错error C2440: '=' : cannot convert from 'const int' to 'int *'
//**q = 88; //这样写也不对,**q表示以*q为地址的变量,但*q是整形变量,不是能做地址。会报错error C2100: illegal indirection
*q = 88; //q与p指向的地址相同,所以*q和*p代表的是相同的变量,在f函数里为*q赋值,main函数中的*q的值会变化
//free(q); //不可以释放q指向的地址,因为这个地址就是main函数中p指向的地址,在这里释放会造成 输出发生错误 *p=-572662307
}
int main(void)
{
int * p = (int *)malloc(sizeof(int)); //(sizeof(int) 是int型变量所占的字节数
*p = 5;
printf("*p=%d\n",*p); //输出 *p = 5
f(p); //实参p 是int* 型的,所以函数形参也需定义为int *型
printf("*p=%d\n",*p); //输出*p = 88
return 0;
}