首页 > 试题广场 >

有如下程序段,请问运行Test函数结果是?

[单选题]
有如下程序段:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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函数结果是:
  • Thunder Downloader
  • under Downloader
  • Thunderownloader
  • 程序崩溃
推荐
答案:D
思路:
1. str为一个指针,但实际上为int类型,传入函数内部并不会发生任何改变
2. GetMemory函数执行完成后,str仍然指向NULL,所以赋值时回奔溃
3. 正确的做法应该使用双指针

代码如下:
void GetMemory(char **p){
    *p = (char *)malloc(100);
}

void Test(){
    char *str = NULL;
    GetMemory(&str);
    strcpy(str,"Thunder");
    strcat(str+2,"Downloader");
    printf(str);
}

编辑于 2015-02-04 21:48:58 回复(8)
1.参数是值传递,(p和str指向同一块地方NULL)
2.但是函数又给参数p重新开辟空间,所以改变的是p指向的空间,str没变(还是指向NULL)。
3.所以因为str没有空间存放字符串,导致崩溃
发表于 2015-09-07 11:32:47 回复(0)
如果你要改变实参的值,就传递实参的地址。这里指针是作为实参,所以要传递指针的地址。
发表于 2016-04-12 16:45:00 回复(0)
做这类题,我们的思路常常会被出题者所套住。
关于main()函数内部调用带有参数的函数时,一定要注意是按值传递、按指针传递、还是按地址传递。
出题者容易考察的是按指针传递 与  按值传递。这两个会混淆。
按值传递,函数返回后,局部变量的值不会随着调用函数内部的实现----改变而改变。
按地址传递和按指针传递,才会改变局部变量的值。
这道题,GetMemory()是按照按值传递的,因而局部变量,不会因为函数内部 p = (char*)malloc(100);
的实现,而更改。返回主函数后, 仍然是 *str = NULL;。因而在改指针执行操作,会造成程序崩溃。
因为没有为它分配内存。
发表于 2017-02-18 09:56:09 回复(4)
str传的形参,p指向malloc分配的空间,而str依然指向NULL,所以程序会崩溃。答案为D。
发表于 2014-12-29 02:30:54 回复(0)
发表于 2018-07-18 15:42:41 回复(3)
答案:D。
上面程序在运行之后:
1)调用TestMemory(str)后,str并未产生变化,依然是NULL(由于str是按值传递的)。
   只有形参p指向了一块新申请的空间。
2)程序运行到strcpy( str,"hello world");处将产生错误。
3)申请空间的时候有可能内存出错,应该在语句*p = (char*)malloc( num );
   之后判断内存是否申请成功,应该添加如下代码:
   if(*p == NULL)  
   {  
   ...//进行申请内存失败处理  
   } 
4)动态创建的内存没释放。
可以参考以下修改方法:
完整代码如下:
#include <stdio.h> 
#include <stdlib.h> 
#include <iostream>
usingnamespacestd;
char*GetMemory()  
{  
   char*p = (char*)malloc(100);  
    if(*p == NULL)
    {
        perror("error...");
        exit(1);
    }
   returnp;  
}  
intmain()  
{  
   char*str = NULL;  
   str = GetMemory();  
   strcpy(str,"Thunder");
   strcat(str+2,"Downloader");
   printf(str);  
   free(str);  
    printf("\n");
    return0;

发表于 2018-07-07 15:10:38 回复(1)
要改变str要用二级指针!
发表于 2020-10-15 16:50:04 回复(1)
如果想通过malloc函数为指针变量分配内存,则形参必须是一个二级指针,否则会出现野指针操作
发表于 2017-05-20 16:34:49 回复(0)
此题,其实考点是:形参只是实参的副本,只是p指指向100字节的堆内存,而buf还是null ,对空指针操作是非法的,而引起崩溃。
发表于 2015-11-12 09:14:24 回复(0)
这是考察二级指针最明显的一种。。。
发表于 2016-10-08 20:09:16 回复(0)
这里考察的是,要修改实参,就要传递实参的地址。
还值得我们注意的是
voidGetMemory(char**p){
    *p = (char*)malloc(100);
}
 
voidTest(){
    char*str = NULL;
    GetMemory(&str);
    strcpy(str,"Thunder");
    strcat(str+2,"Downloader");
    printf(str);
}
程序中,strcat(str+2, "Downloader"), +1,+2,.....+7都能得到结果:ThunderDownloader
但是,strcat(str+num, "Downloader"), num > 7后,就只能得到Thunder.
编辑于 2016-09-23 15:39:43 回复(0)
值传递,需要传二级指针。
发表于 2024-03-20 21:17:06 回复(0)
注意参数是值传递
发表于 2023-10-12 15:56:32 回复(1)
sb了之间看了下面的strcmp和strcat。。。。,原来他是NULL。。。
发表于 2021-10-12 08:08:45 回复(0)
只传入了指针,这里不会返回指针分配的动态空间,如果要保存分配的动态空间,要用指针的指针传递。
发表于 2016-05-20 12:31:47 回复(0)
我在想如果传的是2及指针,答案是啥
发表于 2023-09-15 14:47:40 回复(0)
参数是值传递
发表于 2022-09-16 21:02:06 回复(0)
这里GetMemeory执行完str依旧为空,形参传错了,应该是char **p;因为实参传的指针的地址,所以形参得用两级指针
发表于 2022-05-02 11:49:26 回复(0)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void GetMemeory(char **p) {
    *p = (char *)malloc(100);
}

int main()
{
    char *str = NULL;
    GetMemeory(&str);
    strcpy(str, "Thunder");
    strcat(str + 2, "Downloader");
    printf(str);
    return 0;
}

发表于 2022-03-15 15:14:56 回复(0)
    GetMemory(&str);

发表于 2021-08-04 09:55:37 回复(0)