C语言内存分配相关练习
2013-06-23 12:06
316 查看
1、输出结果:hello;
因为局部指针变量p传给函数GetMemory之后,函数参数是指针的指针,这样就可以通过指针的特性,直接操作main函数中的局部指针变量,为其分配适当的内存空间
void GetMemory(char** pt, int num) {
*pt = (char*)malloc(100);
}
int main() {
char *p = NULL;
GetMemory(&p, 10);
strcpy(p, "hello");
printf(p);
free(p);
p = NULL;
return 0;
}
2、
(1)输出结果:hello;
char *getMemory(void) {
char *p = (char*)malloc(10);
printf("p = %p \n", p); //这里输出的地址和mian函数中相同
printf("s = %s\n", p); //这里输出乱码,因为并没有给它赋值
return p;
}
int main(){
char *p = NULL;
p = getMemory();
strcpy(p, "hello");
printf("p = %p \n", p); //和getMemory分配的地址相同
printf("s = %s\n", p); //输出hello
return 0;
}
(2)输出结果:hello
char *getMemory(void) {
char *p = (char*)malloc(10);
p = "hello";
printf("p2 = %p \n", p); //这里两处输出和main函数中的相同
printf("s2 = %s\n", p);
return p;
}
int _tmain(int argc, _TCHAR* argv[]){
char *p = NULL;
p = getMemory();
printf("p2 = %p \n", p);
printf("s2 = %s\n", p);
return 0;
}
(3)没有输出结果,在运行时出现错误
解析:getMemory中的形参是char *pt,当你传入一个char *p指针时,getMemory并没有真正操作p指针,而是操作其一个副本
char *getMemory(char *pt) {
pt = (char*)malloc(10);
return pt;
}
int main(){
char *p = NULL;
getMemory(p);
printf("%p\n",p); //这里输出的是00000000,也就是指针仍旧为空,将上一句改为 p = getMemory(p); 就可以正常执行了
strcpy(p, "hello");
printf(p);
return 0;
}
4、
(1)如下代码,可以正确执行
char *getMemory(void) {
char *p1 = "hello";
printf("p1 = %p\n", p1); //这里两处的输出和main函数中的相同
printf("s1 = %s\n", p1);
return p1;
}
void main(void) {
char *p1= NULL;
p1 = getMemory();
printf("p1 = %p \n", p1);
printf("s1 = %s\n", p1);
return;
}
(2)如下代码,最终在main函数中会输出不确定值
char *getMemory(void) {
char p1[] = "hello";
printf("p1 = %p\n", p1); //输出一个内存地址
printf("s1 = %s\n", p1); //输出hello
return p1;
}
void main(void) {
char *p1= NULL;
p1 = getMemory();
printf("p1 = %p \n", p1); //输出的内存地址和getMemory1的地址相同
printf("s1 = %s\n", p1); //输出不确定值
return;
}
解析:4(1)和4(2)中唯一不同的是,4(2)中getMemory返回的是局部char型数组的首地址,而4(1)中getMemory返回的是局部char*,所以说char型数组名和char型指针的效果是不同的,个人理解char型数组名的内存地址是固定的,不会再改变,但是char型指针可以随意改变指向的内存地址
上面的截图就是4(2)运行效果图,执行环境是win7系统下的visual studio 2010
因为局部指针变量p传给函数GetMemory之后,函数参数是指针的指针,这样就可以通过指针的特性,直接操作main函数中的局部指针变量,为其分配适当的内存空间
void GetMemory(char** pt, int num) {
*pt = (char*)malloc(100);
}
int main() {
char *p = NULL;
GetMemory(&p, 10);
strcpy(p, "hello");
printf(p);
free(p);
p = NULL;
return 0;
}
2、
(1)输出结果:hello;
char *getMemory(void) {
char *p = (char*)malloc(10);
printf("p = %p \n", p); //这里输出的地址和mian函数中相同
printf("s = %s\n", p); //这里输出乱码,因为并没有给它赋值
return p;
}
int main(){
char *p = NULL;
p = getMemory();
strcpy(p, "hello");
printf("p = %p \n", p); //和getMemory分配的地址相同
printf("s = %s\n", p); //输出hello
return 0;
}
(2)输出结果:hello
char *getMemory(void) {
char *p = (char*)malloc(10);
p = "hello";
printf("p2 = %p \n", p); //这里两处输出和main函数中的相同
printf("s2 = %s\n", p);
return p;
}
int _tmain(int argc, _TCHAR* argv[]){
char *p = NULL;
p = getMemory();
printf("p2 = %p \n", p);
printf("s2 = %s\n", p);
return 0;
}
(3)没有输出结果,在运行时出现错误
解析:getMemory中的形参是char *pt,当你传入一个char *p指针时,getMemory并没有真正操作p指针,而是操作其一个副本
char *getMemory(char *pt) {
pt = (char*)malloc(10);
return pt;
}
int main(){
char *p = NULL;
getMemory(p);
printf("%p\n",p); //这里输出的是00000000,也就是指针仍旧为空,将上一句改为 p = getMemory(p); 就可以正常执行了
strcpy(p, "hello");
printf(p);
return 0;
}
4、
(1)如下代码,可以正确执行
char *getMemory(void) {
char *p1 = "hello";
printf("p1 = %p\n", p1); //这里两处的输出和main函数中的相同
printf("s1 = %s\n", p1);
return p1;
}
void main(void) {
char *p1= NULL;
p1 = getMemory();
printf("p1 = %p \n", p1);
printf("s1 = %s\n", p1);
return;
}
(2)如下代码,最终在main函数中会输出不确定值
char *getMemory(void) {
char p1[] = "hello";
printf("p1 = %p\n", p1); //输出一个内存地址
printf("s1 = %s\n", p1); //输出hello
return p1;
}
void main(void) {
char *p1= NULL;
p1 = getMemory();
printf("p1 = %p \n", p1); //输出的内存地址和getMemory1的地址相同
printf("s1 = %s\n", p1); //输出不确定值
return;
}
解析:4(1)和4(2)中唯一不同的是,4(2)中getMemory返回的是局部char型数组的首地址,而4(1)中getMemory返回的是局部char*,所以说char型数组名和char型指针的效果是不同的,个人理解char型数组名的内存地址是固定的,不会再改变,但是char型指针可以随意改变指向的内存地址
上面的截图就是4(2)运行效果图,执行环境是win7系统下的visual studio 2010
相关文章推荐
- C语言编程中分配内存空间的相关函数
- 深入解析C语言中的内存分配相关问题
- C语言内存分配疑问及相关回答
- C语言malloc,calloc,realloc,free内存分配函数学习笔记
- C语言 内存分配 地址 指针 数组 参数 实例解析
- 队列---C语言实现---三种内存分配方式
- 堆区 内存的动态分配和手动释放 重复练习5遍
- c语言中内存的动态分配与释放(多维动态数组构建)
- C语言柔性数组分配内存
- c语言的内存机制以及分配情况
- c语言内存分配问题
- C语言内存分配时间
- c语言中的动态内存分配~
- 链表的C语言实现(含动态内存分配)
- C语言内存分配管理常见bug
- Java中内存分配相关知识收集
- c语言分配内存方式以及常见内存错误
- c语言内存分配解析
- C语言动态内存分配 :malloc() calloc()
- C语言中内存分配