有如下程序段:
void GetMemeory(char *p)
{
p = (char *)malloc(100);
}
void Test()
{
char *str = NULL;
GetMemeory(str);
strcpy(str, "Thunder");
strcat(str + 2, "Downloader");
printf(str);
}
请问运行Test函数结果是:
A Thunder Downloader
B under Downloader
C Thunderownloader
D 程序崩溃
str为一个指针,但实际上为int类型,传入函数内部并不会发生任何改变(str是一个指针,在32位的机器上,它是一个32位的整数,存储一个内存地址的值)
GetMemory函数执行完成后,str仍然指向NULL,所以赋值时回奔溃
正确的做法应该使用双指针 或使用引用
按值传递,函数返回后,局部变量的值不会随着调用函数内部的实现—-改变而=改变。
按地址传递和按指针传递,才会改变局部变量的值。
这道题,GetMemory()是按照按值传递的,因而局部变量,不会因为函数内部 p = (char*)malloc(100);
的实现,而更改。返回主函数后, 仍然是 *str = NULL;。因而在改指针执行操作,会造成程序崩溃。
因为没有为它分配内存。
双指针方法:
链接:https://www.nowcoder.com/questionTerminal/681153b22f4d4622a7bf63cb6670aa23
来源:牛客网
void GetMemory(char **p){
*p = (char *)malloc(100);
}
void Test(){
char *str = NULL;
GetMemory(&str);
strcpy(str,"Thunder");
strcat(str+2,"Downloader");
printf(str);
}
引用方法:
void GetMemeory(char* &p)
{
p = (char *)malloc(100);
}
void Test()
{
char *str = NULL;
GetMemeory(str);
strcpy(str, "Thunder");
strcat(str + 2, "Downloader");
printf(str);
}
strcat用于将两个char类型链接的函数。
函数原型:extern char *strcat(char *dest,char *src);
参数:
dest 目标数组指针
src 源字符串指针
返回值:返回指向dest的指针
函数功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)并添加’\0’。
printf(str);
运行结果:
ThunderDownloader
若最后打印信息为:
printf(str+2)
运行结果:
underDownloader
cout对象认为char的地址是字符串的地址,因此一直输出知道遇到空字符结束。