首页 > 试题广场 >

运行下面这段代码,会出现的情况是?

[单选题]
运行下面这段代码,会出现的情况是:()
void GetMemory(char *p) { p = (char *)malloc(100); }

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


  • hello world
  • 显示为乱码
  • 程序崩溃
  • hello
推荐
答案:C
GetMemory(char *p);这里*p是形参,是局部变量
不能讲malloc申请的地址指针返回,造成内存泄露
更严重的是执行GetMemory(str);后str依然为NULL
执行strcpy(str, 'hello world');就会出错
编辑于 2015-01-17 11:05:58 回复(8)
答案是C,但是不仅仅是指针问题(这是一方面问题),这道题编译都要出错
测试平台:vs2010
错误根源:strcpy的常字符串 应该使用“”
如图:

发表于 2015-01-26 20:49:42 回复(2)
#include <iostream>
using namespace std;

class A
{
public:
	void getMemory(char **p)
	{
		*p = (char *)malloc(100);
	}

	void test()
	{
		char *str = NULL;
		getMemory(&str);
		strcpy(str, "hello world");
		printf(str);
	}
};

void main()
{
	A a;
	a.test();
}
应该用二级指针
发表于 2015-08-10 17:17:00 回复(5)
GetMemory虽然在堆上申请了内存空间,但是并未将地址赋值给str。str的值仍然为0,在进程地址空间中地址0为系统保留地址空间,在linux下进程访问会报段错误。linux进程地址空间图解:


选C
发表于 2015-01-22 12:02:12 回复(0)
GetMemory(char *p); 永远不要指望使用这种方式进行内存的申请,因为*p是形参,编译器总是要为函数的每个参数制作临时副本,参数p的副本为_p,编译器使得_p=p,如果函数体内的程序修改了_p的内容,导致参数p的内容作相应的修改,这是指针可以用作输出参数的原因。但是本例子中,_p申请了新的内存,只是把_p所指的内存地址改变了,p依旧指向自己原来指向的内存地址。所以GetMemory函数不会输出任何东西
发表于 2017-06-26 23:07:13 回复(0)
GetMemory函数改为 GetMemory(char *&p)即可正常运行。
发表于 2017-03-28 19:15:43 回复(2)
改变数值传指针,改变指针传二级指针。
发表于 2017-03-01 09:31:47 回复(0)
二级指针
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
函数调用改为GetMemory(&str);
编辑于 2020-04-02 20:59:01 回复(0)
    粗心了,这个函数的函数传递是值传递,而指针的值是地址
char*str = NULL;//空指针  
GetMemory(str);//将str的值(也就是空指针)传递给ptr
形参指针p接收到null,他和str并不是同一个指针,再给他开辟一个堆空间,然后指针p在函数结束时候被销毁。这个堆和返回值类型是用来误导人的。

发表于 2018-09-27 19:57:36 回复(0)
1 getmemory 为str分配内存失败
2 getmemory 动态申请没有释放,内存泄漏
3 strcpy执行时向一个空指针指向的内存传数据,程序崩溃
发表于 2017-09-12 10:37:21 回复(0)
GetMemory(char *p);这里*p是形参,是局部变量
不能将malloc申请的地址指针返回,造成内存泄露
发表于 2016-05-18 17:02:30 回复(0)
1、传的参数是指针,拷贝的是指针的值;拷贝之后,两个指针(str、p)是不同的指针;
2、一般情况,指针为形参,函数仅能改变(二级)指针所指的对象;所以如果传递的是二级指针(即&str)的话,函数GetMemory恰好是可以将malloc返回的char*指针类型的值传给,二级指针str所指的对象一级指针。malloc函数返回的是被分配内存的地址;
以上仅代表个人观点。
发表于 2016-02-23 20:59:24 回复(0)
C
应当传二级指针
发表于 2015-04-04 23:32:51 回复(0)
void GetMemory(char **p)
{
    *p = (char *)malloc(100);
}
函数调用改为GetMemory(&str);
或者
void GetMemory(char *&p)
{
    p = (char *)malloc(100);
}
都可以正常运行。
发表于 2018-03-24 15:57:01 回复(0)
char* GetMemory(char *p)
{
    p = (char *)malloc(100);
    memset(p,0,sizeof(p));
    return p;
}

int main(void)
{
    char *str = NULL;
    str = GetMemory(str);
    strcpy(str, "hello world");
    printf(str);
    return 0;
}
改成这样就对了,指针是值传递的,传递到GetMemory的是一个副本,本身的char* str并没有改变
发表于 2016-06-28 08:56:44 回复(0)
printf(str);都出错了,应该为puts(str);
编辑于 2024-01-08 08:28:08 回复(0)
一般情况下,函数中传递指针可以修改值,但是在函数中开辟的内存空间只能本函数识别使用,堆。
发表于 2023-10-14 00:21:35 回复(0)
void GetMemory(char **p) 
    *p = (char *)malloc(100); 
}
 
void Test(void) {
    char *str = NULL;
    GetMemory(&str);
    strcpy(str, "hello world");
    printf(str);
}
发表于 2023-08-08 20:31:35 回复(1)

在 C 语言中,函数参数传递方式包括值传递(pass by value)和引用传递(pass by reference)。在值传递方式中,函数获得的是实参的一个副本,对副本的修改不会影响实参。而在引用传递方式中,函数获得的是实参的地址,可以通过地址来修改实参的值。

在原始的GetMemory函数中,指针参数p是以值传递的方式传递的。因此,当在GetMemory函数中对p进行赋值时,实际上是修改了p的副本,而不是修改Test函数中str指针的值。因此,尽管在GetMemory函数中成功地分配了新的内存块,但Test函数中的str指针仍然是NULL,无法正确地使用分配的内存块。

将GetMemory函数改为使用指向指针的指针或者引用类型的参数可以解决这个问题。通过使用指向指针的指针或者引用类型的参数,可以将实参的地址传递给函数,并在函数内部修改实参的值。在本例中,使用指向指针的指针或者引用类型的参数可以将Test函数中的str指针的地址传递给GetMemory函数,并在GetMemory函数中修改str指针的值,使其指向新分配的内存块。
void GetMemory(char **p) {
    *p = (char *)malloc(100);
}

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


发表于 2023-02-23 15:20:51 回复(0)
printf中不要双引号也行吗?
发表于 2022-12-17 11:27:48 回复(0)
相当于传入a,a修改无法传回。应该用二级指针。
发表于 2022-03-25 16:21:32 回复(0)