首页 > 试题广场 >

请指出以下程序的错误。

[不定项选择题]
请指出以下程序的错误:
void GetMemory(char **p, int num){
    if(NULL == p && num <= 0)//1
        return;
    *p = (char*)malloc(num); 
    return;
}
void main(void){
    char *str = NULL;
    GetMemory(&str, 80); //2
    if(NULL != str){
        strcpy(&str, "hello"); //3
        printf(str);
    }
    return true; //4
}
  • 1
  • 2
  • 3
  • 4
 if(NULL==p && num<=0)//1  应该为 if(NULL==p || num<=0)
 strcpy(&str,"hello"); //3   应为 strcpy(str,"hello"); 
 return true; //4   与void冲突
发表于 2017-10-09 08:51:04 回复(11)
b选项因为GetMemory(char **p, int num)  p是指向指针的指针,应该接收一个指针的地址。所以把&str传过去是正确的。
发表于 2015-09-16 19:07:15 回复(1)
错误1:main 函数返回值类型为void 不可以有return true.
错误2:strcpy(&str,”hello”); 修改为strcpy(str,”hello”);
编辑于 2017-08-15 16:30:21 回复(2)
GetMemory(&str,100);  传入str的地址,char*str=NULL; str是空指针,但是空指针也有地址,
所以char**p里面的p相当于是str的地址,所以调用GetMemory后才能进入if为str在堆上分配空间。
后面也没有释放内存。 但是这不会导致程序错误,只会导致内存泄漏。
char*str类似于string str,为字符串赋值,&str应该改为str,所以3错。
void 主函数不该有返回值,所以4错。

发表于 2016-10-20 10:54:38 回复(0)
冬头像
strcpy(&str,"hello"); //3原型声明 char *strcpy(char *dest,char *src);
     returntrue; //4 不仅仅是与void的声明有冲突,还有就是没有释放掉动态申请的内存
发表于 2015-08-21 08:54:59 回复(3)

知道CD错了,我想知道A错在哪里了

发表于 2017-09-02 14:54:40 回复(5)
选择C D:
3处:函数strcpy(char*,const char*);而&str是char**,所以类型不匹配
4处:main()函数的类型为void,没有返回值
发表于 2015-09-11 22:56:01 回复(0)
A中 条件语句里应该是 ||,而不是&&
发表于 2017-11-19 11:57:23 回复(0)
错误1:main 函数返回值类型为void 不可以有return true. 
错误2:strcpy(&str,”hello”); 修改为strcpy(str,”hello”);
二级指针那:*p=NULL
发表于 2017-10-04 00:03:50 回复(0)
A应该是或而不是并且吧
发表于 2017-11-06 10:58:18 回复(0)
1、&& 改为 ||;
2、传指针变量的地址;
3、不要取址符 &;
4、main 函数的返回类型为 void。
发表于 2017-09-11 16:39:16 回复(0)
void GetMemory(char **p, int num)
{
    if(NULL==p && num>0)
        return;
    *p=(char*)malloc(num); //1
    return;
}
void main(void){
    char *str=NULL;
    GetMemory(&str,100); //2
    if(NULL!=str){
        strcpy(&str,"hello"); //3
        printf(str);
    }
    return true; //4
}
3处的错误在于strcpy(para1,para2)中的para1位char*类型,而str本身就是char*类型,&str为char**类型
4处的错误是:main函数是个无返回值的函数void main(){},return true表示bool main(){}
所以选择C和D
1处没有错误,malloc(int)函数就是这么用的,2处也没有错误,符合GetMemory()函数的定义格式,str本身是char*,那么&str就是char**
发表于 2015-06-08 17:48:06 回复(0)
3,4错误很明显,我觉得1处的第一个条件是多余的,二级指针p存放着指针str的地址,不会空,而str本来就初始化为空,没必要判断,所以是多余的
发表于 2018-03-07 09:45:56 回复(0)
对于1:这种写法是正确的。因为函数参数是char **p,是指针的指针,即一个指向指针的地址。所以main中要写成GetMemory(&str, 100)。注意如果原题要写成这样:void *GetMemory(char *p, int num );  GetMemory(str, 100),这样就是错误的,因为调用GetMemory时,传过去的第一个参数是str的一份拷贝,并不是str本身。
对于2 :见上述
对于3:应该是strcpy(str, "hello");
对于4:main的返回类型是void。
发表于 2017-02-20 11:27:55 回复(0)
我只看的语法错误 逻辑错误,额,哎
编辑于 2023-12-06 01:52:32 回复(0)
在 GetMemory 函数中,*p 是一个指向指针的指针,函数期望传入的是一个指针的地址,但在 main 函数中调用时,传入的是 str 的地址,这是正确的。然而,在 GetMemory 函数内部的 *p 被赋值为了 malloc(num) 返回的指针,这是正确的分配内存的方法。然而,由于没有对 *p 进行 NULL 检查,如果内存分配失败,*p 就会成为悬空指针。 在 main 函数中,在使用 strcpy 函数时,&str 传递的是 str 指针的地址,而不是 str 指针指向的地址。应该直接使用 str 而不是 &str。 main 函数的返回类型应该是 int 而不是 void,并且应该使用 return 0 表示程序正常结束。
发表于 2023-11-08 19:03:36 回复(0)
p是指针的指针。 *p=&str **p=str 1) &&改为|| 。 3) &str改为str 4) main函数返回值为void,不可以有返回值。
发表于 2023-09-01 09:26:22 回复(0)
  1. 在 GetMemory 函数中,如果传入的 p 参数是 NULL,那么代码就会出现问题,因为无法通过空指针来修改指向的内存地址,这样会导致程序崩溃。因此应该改为如下代码:
if(p == NULL || num <= 0)
    return;

这样可以保证在参数有误时不会继续执行后面的代码。

  1. 在 main 函数的第 7 行中,将字符串字面量 "hello" 的地址传递给 strcpy 函数,这是错误的,应该传递字符串指针变量 str 的地址,即 str。因此应该改为如下代码:
strcpy(str, "hello");
  1. 在 main 函数最后,使用了一个不合法的语句 return true;,因为 main 函数的返回类型是 void,不需要返回任何值。应该改为如下代码:
return;

改正以上问题后,完整的代码应该如下所示:

void GetMemory(char **p, int num){
    if(p == NULL || num <= 0)
        return;
    *p = (char*)malloc(num);
    return;
}

int main(void){
    char *str = NULL;
    GetMemory(&str, 80);
    if(str != NULL){
        strcpy(str, "hello");
        printf("%s\n", str);
        free(str); // 释放内存
    }
    return 0;
}

这样就能够正常分配内存并释放内存,输出 hello 字符串了。

发表于 2023-04-17 13:34:29 回复(0)
1.如果传入的p为NULL,或者num<=0,则不申请空间,直接返回
3.str为char*类型,&str为char**类型,strcpy(char*,char*);
4.void main(),返回值类型为空;
发表于 2022-12-15 10:19:01 回复(0)
A选项思考:
c++应该是为了防止,从二维,三维,N维直接变成0维产生的各种问题。就直接把每个初始化为null的指针变量赋值为0,而不是把指针指向null


发表于 2022-10-29 15:53:15 回复(0)