首页 > 试题广场 >

下列代码运行出错,可能会是哪一行引起的?

[单选题]
下列代码运行出错,可能会是哪一行引起的?
void getMemory(char *p) {
    p = (char *)malloc(100); // 1
}

int main(int argc, char const *argv[]) {
    char *str = NULL;
    getMemory(str);
    strcpy(str, "hello wrold"); // 2
    printf("%s\n", str);        // 3
    free(str);                  // 4
}

  • 1
  • 2
  • 3
  • 4
逻辑错误在第1行,但是运行时在第二行出错。
发表于 2016-12-21 20:17:05 回复(7)
1
2
3
4
void getMemory(char *p)  
 p = (char *)malloc(100); 
传入的指针是按照传值的方式传递的。要正确的应为
1
2
3
4
5
6
7
8
9
10
11
12
void getMemory(char **p)  
 *p = (char *)malloc(100);   // 1 
}
// 调用的话getMemory(&str)
 
// 或者
void getMemory(char *&p)  
 p = (char *)malloc(100);   // 1 
// 调用getMemory(str)

发表于 2021-08-30 10:24:22 回复(0)
正确选项:B
1)调用getMemory(str)后,str并未产生变化,依然是NULL(由于str是按值传递的)。只有形参p指向了一块新申请的空间。

2)程序运行到strcpy( str, "hello world" );处将产生错误


发表于 2018-07-07 15:05:05 回复(1)
<p>参数本身就是指针了,传str实际就是按值传递(因为str就是指针)。如果想传递str的指针,应该将参数定为指针的指针。</p><p><br></p>
发表于 2020-11-22 16:37:23 回复(1)
首先,指针也是一个变量,保存的是一个整数,代表内存地址,str指针的初始值为NULL,NULL代表空指针,空指针是不指向任何内存地址的指针,题目中对str指针进行了参数传递,在C语言中,参数传递是值传递,也就是说,getMemory中的形式参数p是str指针的拷贝,经过getMemory函数的调用后,只是改变了p的指向,并不会改变str指针的指向,str指针在经过getMemory函数的调用后仍然是一个空指针,对空指针进行操作会导致未定义的结果,可能只是运行结果错误,甚至可能导致程序崩溃。
发表于 2022-03-20 14:29:33 回复(0)
实验结果很明显,p所分配的空间和str所占用的空间完全不是一个,所以给p分配malloc(100)空间是符合语法的;但是它是在动态空间中分配的,函数a运行结束时,已经不存在了而str的空间一直都是0未曾改变过,所以在向str内拷贝字符串时,会出现无空间接收的情况!!!
发表于 2021-10-28 22:23:30 回复(0)
传入getMemory的是str的拷贝,所以getMemory函数运行返回后,str仍为NULL,这样调用str自然会运行出错。
要想使得传入的就是str指针本身,可以使用传引用的方式。
发表于 2017-03-31 21:06:29 回复(0)
很多解析是在误导人啊,动态分配的空间没有正确free是不会被操作系统回收的,和发生在哪个函数无关。
我们的思维定式是:用指针传递可以把结果带回来,但通常我们的做法是:传指针进去,修改指针的指向的内容。然而这个题目的做法是:传指针进去,修改的是指针本身(指针指向),因此并没有把值带回去,其次指针p本身会被回收,因为指针本身就是一个4或8字节的变量而已。并且该代码会有内存泄漏,当getMemory函数离开时,其唯一指向标p已经没有了。
发表于 2022-10-04 11:46:51 回复(0)
str开辟了一块空间,*P也开辟了一块空间,*p指向str,p出了getmemory函数之后,p就会把开辟的空间还给操作系统,然后str就指向随机值,p在栈区开辟了空间,返回栈的空间,非法访问内存。所以不是第一行引起的吗?只要加一个return p;就可以了呀,或者用static在静态区开辟空间也行呀
编辑于 2022-03-09 00:20:33 回复(0)
改变了指针 但是函数是按值传递 在函数中也没有通过地址改变指针的值 如果要改变实参 应该用指针的指针
发表于 2021-01-07 08:51:02 回复(0)
void getMemory(char **p)
{
    *p = (char *)malloc(100); // 1
}

int main(int argc, char const *argv[])
{
    char *str = NULL;
    getMemory(&str);

    strcpy(str, "hello wrold"); // 2
    printf("%s\n", str);        // 3
    free(str);                   // 4
    getchar();
    return 0;
}

发表于 2023-04-07 11:31:41 回复(0)

在函数getMemory中,我们传递了一个指向字符的指针p。然后,在第1行中,我们试图为p分配内存并将其指向新分配的内存块。

然而,需要注意的是,C语言中的参数传递是通过值传递进行的。这意味着在函数getMemory中,我们虽然修改了指针p的值,但这个修改不会影响到main函数中的实际参数str。

因此,当我们在main函数中的第2行尝试使用strcpy复制字符串到str指向的内存时,str仍然是NULL,没有指向有效的内存块。这将导致未定义行为和错误。

所以,选项B中的第2行代码strcpy(str, "hello wrold");可能会引起代码运行错误。

发表于 2023-11-15 09:49:55 回复(0)
传普通参数(int)到函数中,形参接收时要用一级指针。否则形参创建的是一个新的变脸空间,而不是指向旧的变量空间。
要传指针到函数中,形参接收时要用二级指针。将指针的地址传到函数中,才会给其分配空间,否则分配空间的是新的指针,和外接的指针指向空间没有关系。
int main()
{
int * p;
getMemory(&p);
}
发表于 2023-10-15 21:49:07 回复(0)
重要!
发表于 2022-02-18 11:37:14 回复(0)
不能轻敌啊,开辟空间的函数本身没问题,值没传出来,你用就是你的问题了
发表于 2021-08-25 16:53:21 回复(0)
后面懂的兄弟再讲明白点!!
发表于 2020-11-18 20:34:59 回复(0)
问直接说报错在哪行不就得了呗
发表于 2023-10-15 13:56:01 回复(0)
传递的str指针按照传值的方式传递的,最后不会分配内存
发表于 2023-07-09 16:32:32 回复(0)
gg
发表于 2022-11-29 13:59:22 回复(0)

    因为题中str本身就是一级指针,函数传参就是一级指针传一级指针,而且getMemory函数没有返回值,(相当于值传值)。所以str使用二级指针传参。
    我理解的是函数没有返回值,而且还想在主函数中得到改变,传参是就要传与定义的变量不同类型(值-->传引用,一级指针-->二级指针)
编辑于 2022-09-10 17:41:40 回复(0)