首页 > 试题广场 >

下列说法正确的是( &nbs...

[单选题]
下列说法正确的是()
#include "stdio.h"
#include "string.h"
void fun(char *s){ 
    char t[7];
    s=t;
    strcpy(s, "example");
}

int  main(){ 
    char *s;    
    fun(s);    
    printf("%s",s);
    return 0;
}
  • 输出结果为"example"
  • 输出结果为"烫烫烫烫"
  • 程序编译时出现错误
  • 程序运行时出现错误
对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”
发表于 2020-02-20 17:46:03 回复(13)
1.main函数里的s没有初始化就在fun函数里使用s,编译器会报警告,运行时会报错(局部变量未初始化)。答案选D。
2.就算s初始化了,在fun函数里,局部变量t的大小为7,而strcpy函数会复制example末尾的\0
所以example+'\0'一共8个字节空间,会溢出,程序会崩溃。
3.就算局部变量t的大小足够大,在fun函数运行结束后,局部变量t的内存空间会被释放掉,此时s成为野指针;返回main函数后,也不会输出example。
发表于 2022-03-14 21:54:21 回复(6)
需要解释的就是编译错误和运行错误,编译错误可以理解成编译器能检查出来的错误,运行错误理解成逻辑错误,需要用户自己纠错
发表于 2020-08-11 11:19:37 回复(0)
主函数里的s没有被初始化,即使初始化了,传到fun函数里,也会存在溢出的情况,程序终止。即使s初始化了,也不会输出"example",这只是值传递。
发表于 2020-03-02 12:09:29 回复(4)
#include "stdio.h"
#include "string.h"

void fun(char **s)
{
    *s=(char*)malloc(sizeof(char)*10); 
    strcpy(*s,"example");
    return;
}

int main()
{
    char *s;
    fun(&s); /* 一定要传入s的地址 */
    printf("%s\n",s); /* 可以打印 example */
        free(s);
        s=NULL;
    return 0;
}

#include "stdio.h"
#include "string.h"

void fun(char **s)
{
    //*s=(char*)malloc(sizeof(char)*10);q
    char t[10]; /* *s和t指向同一片栈内存,fun退出时会自动释放t指向的栈内存 */
    *s=t;
    strcpy(*s,"example");
    return;
}

int main()
{
    char *s;
    fun(&s);
    printf("%s\n",s);/* s指向的栈内存在fun退出时已经释放,不会打印example  */
    return 0;
}

供参考。
编辑于 2019-08-31 22:51:03 回复(1)
用vs2017是程序编译就出现错误,没有进行初始化,linux则是段错误,所以与环境有关
发表于 2019-08-17 17:22:22 回复(1)
如果s没有分配内存空间, strcpy(s, "hello")就会导致内存访问的异常。 可以用 s = (char*)malloc(10);分配10字节的内存给s, 或 s = new char[10];
发表于 2019-01-17 08:14:56 回复(0)
我觉得这个很有道理,我看懂了。
1.main函数里的s没有初始化就在fun函数里使用s,编译器会报警告,运行时会报错(局部变量未初始化)。答案选D。
2.就算s初始化了,在fun函数里,局部变量t的大小为7,而strcpy函数会复制example末尾的\0
所以example+'\0'一共8个字节空间,会溢出,程序会崩溃。
3.就算局部变量t的大小足够大,在fun函数运行结束后,局部变量t的内存空间会被释放掉,此时s成为野指针;返回main函数后,也不会输出example。
发表于 2022-10-07 21:31:02 回复(0)
我的理解是野指针问题,定义在函数里的 t 赋值给了s,而函数执行结束后会释放内存,所以s成了野指针。而程序执行到第7行报错,应该是编译器自动检测到了野指针行为。
发表于 2021-03-11 20:27:07 回复(2)
主函数里的s没有被初始化,即使初始化了,传到fun函数里,也会存在溢出的情况,程序终止。即使s初始化了,也不会输出"example",这只是值传递
对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”
发表于 2022-02-23 14:58:22 回复(0)
在fun函数中创建数组t【】。将数组首元素的地址赋值给s,但是函数调用后,数组的内存被释放,s就所指向的空间就没有了,此时s相当于是野指针,会出现报错

编辑于 2023-12-10 15:39:28 回复(0)
#include "stdio.h"
#include "string.h"
void fun(char *s){ 
    char t[7];
    s=t;
    strcpy(s, "example");
}
 
int  main(){ 
    char *s;   
    fun(s);   
    printf("%s",s);
    return 0;
}
A 输出结果为"example"
B 输出结果为"烫烫烫烫"
C 程序编译时出现错误
D 程序运行时出现错误
解读一下程序中有哪些需要考虑到的问题?
首先题目的意思是通过fun函数来初始化指针s。
问题1:char *s;定义变量同时初始化是个好习惯(与答题无关)。
问题2:fun(s);将s的值(保存了地址)以值传递的方式传给形参s,形参是实参的一份拷贝,形参的改变不会影响实参。所以实参s始终没有初始化,printf("%s",s);“应该是”乱码(注意:我说的是“应该是”)。
问题3:fun(s);函数内部执行逻辑,s=t;是将s = &t[0],这一行没有问题(与答题无关)
问题4:由strcpy(char* dest,const char* src);的原型,该函数的实现逻辑是:从src源字符串的首元素开始,一个个的放到目的字符串'\0'位置,及之后位置(包括源字符串的'\0')。
strcpy函数使用几点注意:
1、src源字符串必须以 '\0' 结束。即源字符串不能初始化为字符数组,否则可能会导致越界。如果用该方式初始化,必须加上'\0'。如:char src[] = {'a','b','c','\0'};
2、会将src源字符串中的 '\0' 拷贝到目标空间。
3、目标空间必须足够大,以确保能存放源字符串。
4、目标空间必须可变。即目的地字符串不能初始化为常量字符串。(故选择D)。
如:char* dest = “123”;strcpy(dest,"abc");或者char dest[3] = "12";strcpy(dest,"abc");都会允许时出错,但编译能通过。
因此,该题运行出错的原因是,目标空间不够,无法容纳源字符串。
编辑于 2023-04-29 11:00:05 回复(0)
什么时候回输出烫烫烫
发表于 2020-01-06 22:27:58 回复(3)
对于栈中内存如果没有初始化,则会出现“烫烫烫烫烫烫”。对于堆中内存如果没有初始化,则会出现“屯屯屯屯屯”1.main函数里的s没有初始化就在fun函数里使用s,编译器会报警告,运行时会报错(局部变量未初始化)。答案选D。 2.就算s初始化了,在fun函数里,局部变量t的大小为7,而strcpy函数会复制example末尾的\0 所以example+'\0'一共8个字节空间,会溢出,程序会崩溃。 3.就算局部变量t的大小足够大,在fun函数运行结束后,局部变量t的内存空间会被释放掉,此时s成为野指针;返回main函数后,也不会输出example。
编辑于 2024-03-31 08:57:49 回复(0)
这个才是错误的根本吧,就算main函数里面的s初始化了,也会错误,因为在函数传参数的时候是值传递,除非你这里使用二级指针才能改变main函数里面s的指向,在fun函数中是定义了一个新的局部变量s,通过函数值传递,fun函数中定义的s指向了main函数里面s的指向,然后是s = t的操作之后,s指向了字符数组的首地址,然后执行strcpy(s, "example");,因为字符串 "example"的长度为8,执行这个操作会造成字符数组越界,因为字符数组的大小为7,跟main函数里面的s初始化关系不大,顶多就是一个野指针。
发表于 2023-09-14 19:50:24 回复(0)
我感觉凌乱了,char t[7]只开辟了7个字节的宽度,strcpy(s, "example")加上“\0”有8个字节,不是编译时就会显示越界吗?头好乱啊
发表于 2022-10-19 09:11:54 回复(0)
因为*p一开始没有初始化,那么它就变成了一个野指针,后面的也就不存在了,所以编译会出错误
发表于 2022-07-09 14:40:29 回复(0)
vs2022就是编译错误
发表于 2022-05-11 13:03:28 回复(0)
首先,值传递并不会改变字符串的值,其次,题目中的s,t指向同一块内存,在函数退出时,栈中t指向的内存随之释放,可以使用malloc分配堆的内存。
发表于 2021-06-25 09:02:16 回复(0)
逻辑上看,s未初始化,里面是随机值,然后fun函数接收到一个指向任意位置的指针,然后,这个报错到底是strcpy做了什么检测,觉得是野指针,然后访问有冲突?还是函数接收时检测认为是野指针,然后报错?还有就是s=t这个操作有没有问题呀?😲
发表于 2021-03-16 17:36:21 回复(0)