C++问题,跪求下面4个指针是为什么错,求详解。
#include<stdio.h>#include<stdlib.h>#include<string.h>voidGetMemory(char*p){p=(char*)m...
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char *p)
{
p=(char*)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string>
void *GetMemory(void)
{
char p[]="hello world";
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string>
void Test(void)
{
char *str=(char*)malloc(100);
strcpy(str,"hello world");
free(str);
if(str=NULL)
{
strcpy(str,"hello world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char **p,int num)
{
*p=(char*)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello world");
printf(str);
}
int main()
{
Test();
return 0;
} 展开
#include<stdlib.h>
#include<string.h>
void GetMemory(char *p)
{
p=(char*)malloc(100);
}
void Test(void)
{
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string>
void *GetMemory(void)
{
char p[]="hello world";
}
void Test(void)
{
char *str=NULL;
str=GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string>
void Test(void)
{
char *str=(char*)malloc(100);
strcpy(str,"hello world");
free(str);
if(str=NULL)
{
strcpy(str,"hello world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char **p,int num)
{
*p=(char*)malloc(num);
}
void Test(void)
{
char *str=NULL;
GetMemory(&str,100);
strcpy(str,"hello world");
printf(str);
}
int main()
{
Test();
return 0;
} 展开
2个回答
展开全部
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *GetMemory(int n) { // 参数及返回类型都变了
return (char *)malloc(n);
}
void Test(void) {
char *str = GetMemory(100); // 这样获得动态内存
strcpy(str,"hello world\n");
printf(str);
free(str); // 返还是必要的。
}
int main() {
Test();
return 0;
}
/*
void *GetMemory(void) { // 这样是不行的,函数返回后,p[]就不存在了
char p[]="hello world";
}
void Test(void) { // 这样是可以的。
char *str = (char*)malloc(100);
strcpy(str,"hello world");
if(str != NULL) {
strcpy(str,"hello world");
printf(str);
free(str);
}
}
*/
展开全部
第一种,p=(char*)malloc(100);简单的给形参p赋值为新分配的内存地址,不过我们知道,改变形参的值,并不能改变实参的值,所以char *str=NULL;在GetMemory运行之后,仍然是NULL指针。
第二种,char p[]="hello world";,这是堆栈上的临时变量,只在函数调用到GetMemory的时候有效,GetMemory返回到Test中的时候,已经无效了
第三种,无论如何,free之后的指针不应该继续使用,它不会立即出错,但是会在将来的某个时刻,毁掉你的程序。
第四中,通过传递地址调用,可以为str实际赋值为有效内存地址,通常都是这么做的。
第二种,char p[]="hello world";,这是堆栈上的临时变量,只在函数调用到GetMemory的时候有效,GetMemory返回到Test中的时候,已经无效了
第三种,无论如何,free之后的指针不应该继续使用,它不会立即出错,但是会在将来的某个时刻,毁掉你的程序。
第四中,通过传递地址调用,可以为str实际赋值为有效内存地址,通常都是这么做的。
追问
第二个GetMemory()时不是已经将字符串赋值给*str了吗?
追答
赋值是赋值了,只不过这个值是临时有效的,因为是堆栈上的内存。
赋值的时候,GetMemory函数已经结束了吧,结束了就无效了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询