首页 > 试题广场 >

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

[单选题]
void GetMemory(char **p, int num)
{
    *p = (char *)malloc(num);
}
void Test(void)
{
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf("%s", str);
}
请问运行Test 函数会有什么样的结果?
  • hello
  • 出错
printf这样输出不会错吗?还是这只是一个表达形式?
发表于 2019-08-09 01:13:22 回复(0)
这道题的详细解释: 这其实是二级指针传值的知识

先把题目改成如下:
1.把函数参数从二级指针改成一级指针之后的代码
voidGetMemory(char*p,intnum)
{
   p = (char*)malloc(num);
}
voidTest(void)
{
   char*str = NULL;
   GetMemory(str,100);
   strcpy(str,"hello");
   printf(str);
}
结果就是str为空,也就是函数的操作并没有影响str。
内存图如下:

很明显,指针就是传个地址给函数参数,那么p也是指向空。而操纵的是p而对str没有影响。

2.而源代码是二级指针,内存图如下。

*p = (char*)malloc(num);
*p就是str的地址,操作的也就是str,即给*p分配内存。

总结如下:
对于函数传字符串或者通过malloc分配内存,都需要使用二级指针。

编辑于 2015-11-06 10:56:40 回复(11)
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream>
using namespace std;
void GetMemory(char **p, int num)
{
    *p = (char *)malloc(num);
}
int main()  
{  
    char *str = NULL;
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf(str);   
    printf("\n"); 
    return 0;

/* 输出结果:
hello
Press any key to continue
*/
答案:hello。

需要注意的是,虽然上述程序存在运行结果,但是程序在结束的时候没有释放掉申请的空间,是存在风险的。

编辑于 2019-04-30 14:29:48 回复(0)
其实总结一下一级指针只能改变值(地址也是一种值),而二级指针才能改变指针的指向
发表于 2022-05-04 15:47:57 回复(0)

栈空间内变量: 运行时, 若是函数内部使用的变量, 则函数一旦返回其就会被释放, 生存周期仅限于函数内部.

堆空间内(malloc函数返回)变量: 运行时, 可以自由地管理分配和释放空间, 生存周期由程序员决定; 不同于栈空间内的变量; 也即*p = (char*)malloc(num);申请的堆空间在函数结束返回时不会被操作系统回收;
发表于 2022-01-09 10:54:23 回复(0)
想着不会这么简单,于是将A换成了C
发表于 2022-04-09 08:35:38 回复(0)
虽然运行的结果是hello,但是没有内存释放,可能会造成内存泄露
发表于 2020-02-11 08:47:51 回复(0)
发表于 2020-05-29 10:16:35 回复(0)
*注意
发表于 2020-05-03 21:38:39 回复(0)
这道题虽然不严谨,存在的问题有:1、malloc没有判断是否成功开辟空间。2、没有对堆区空间free释放。但是不影响做题,首先,如果开辟空间成功,则答案选A。其次,如果没有开辟成功或者开辟成功,但是没有释放空间,因为后续程序没有足够的空间使用,则选C。
发表于 2023-04-29 11:10:51 回复(0)
既没判断malloc可能开辟空间失败,就直接拷贝字符串,又没有free malloc开辟的空间,可能导致内存泄露
发表于 2022-04-30 09:08:46 回复(0)
这题太不严谨了 ,二级指针传出malloc分配内存没错,但是最后输出函数明显用的不对呀
发表于 2021-06-09 23:54:25 回复(0)
缺少\n,啥也不输出
发表于 2026-02-11 17:47:21 回复(1)
题有问题吧,字符串输出要找到结束符,这个str后面是垃圾值,多长之后才有结束符号是不确定的。甚至可能越界读到其他内存区域。
发表于 2025-05-29 09:37:49 回复(0)
不用free吗?
编辑于 2023-12-26 15:13:20 回复(0)
是我多想了,malloc()开辟的空间,是不会初始化的,以为strcpy()不会复制’\0’。
发表于 2023-11-03 08:19:18 回复(0)
<p>1.上面函数参数列表传入str,相当于让p指向str,</p><p>2.而*p则是访问p所指向的内容,</p><p>3.后面malloc正好是返回一个地址给p所指向的内容,</p><p>4.故str指向了num</p><p>5.p-〉str-〉num</p>
发表于 2020-10-28 08:55:16 回复(0)
题目都错了…
发表于 2020-05-17 21:41:19 回复(0)
printf(str)没问题吗?
发表于 2019-08-01 23:40:45 回复(0)
输出hello
发表于 2018-05-28 11:58:36 回复(0)