您的位置:首页 > 其它

C有关内存的思考题

2015-10-20 09:51 267 查看
void GetMemery(char *p){
p = (char *)malloc(100);
}

void Test(){
char *str = NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}

int main(){
Test();
}


请问运行test函数会有什么样的结果?

下面是在windows下vs2013编译器的结果:程序崩溃

因为GetMemory方法并不能传递动态内存!test函数中的str一直都是null;strcpy将使程序崩溃

之所以不能传递动态内存,是因为在使用指针作为参数传递进另外一个函数的时候,如果在这个函数中修改了指针参数的地址,原来的指针还是不变的,因为在函数中调用另外一个函数并且将指针作为参数进行传递时,会将原来的指针复制一份,并且将这个副本当做实参传递进test函数,并且将其压进函数栈,在test函数中所进行的修改地址的操作只会修改指针副本的地址,对原来的指针是不会有影响的!正如一个经典的swap函数

swap(int *a,int *b){
int *temp = a;
a = b;
b = temp;
}


如果用上面这段程序来对两个数进行交换的话,那么是不会成功的,注意我是用的一个指针类型的temp,相当于在swap函数中修改了a,b的地址,所以根据上面所说的原理,是不能交换两个数的,如果想要交换,那么将temp的类型改为int类型,而不是Int指针类型,就ok。

如果想要在函数体内修改指针的地址,不能直接修改指针的地址,而应该传入一个指针类型的引用或者指针的指针,两者都是二级指针,就像下面这段代码!

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

//直接在指针上分配动态内存,不可取,程序崩溃
void GetMemory(char *p){
p = (char *)malloc(100);
}
//使用指针类型的引用来作为参数进行传递,这样是可行的,输出helloworld
void GetMemory2(char *&p){
p = (char*)malloc(100);
}
//使用指针的指针来进行参数的传递,这样也是可行的,输出helloworld
void GetMemory3(char **p){
*p = (char*)malloc(100);//此处要直接给二级指针所指向的一级指针所指向的字符数组直接分配内存,因为我们需要的是在一级指针所指向的内存中复制helloworld进去
}

void Test(){
char *str = NULL;
//GetMemory(str);
//GetMemory2(str);
char **str2 = &str;
GetMemory3(str2);
strcpy(str,"hello world");
printf(str);
}

int main(){
Test();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: