您的位置:首页 > 编程语言 > C语言/C++

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: