char s1[]="string",s2[8],*s3,*s4="string2" 下面对strcpy的调用那些是正确的,为什么,求详解?

A:strcpy(s1,"string2")B:strcpy(s4,"string1")C:strcpy(s3,"string1")D:strcpy(s1,s2)
2024年11月23日 08:37
有4个网友回答
网友(1):

A,可以正确执行,但是因为拷贝内容的长度超出存储区一个字符,可能会导致下次访问的时候,访问到一个错误的字符串。因为c或c++里的字符串是以'/0’结尾的,原先结尾处的'/0'被覆盖,会导致程序找不到正确的字符串结尾。我测试中在程序结尾dump时出错,可能是因为调试器需要dump字符串的内容,从而导致错误。
B,执行结果可能会因为编译器的不同而有所不同。在有些编译器中,s4指向的内存区是要求只读的。但是,我测试gcc编译器好像执行没有问题。
C,s3未被初始化,可能指向系统中的任意位置。最可能的结果是访问地址越界。即便程序在执行这句时不报错,结果也是未知的,有可能导致系统更严重的错误。
D,s2内的内容是未初始化的。如前面所说,被当成字符串处理时将无法找到正确的字符串结尾。该语句执行的结果未知,主要看是否会再次访问该字符串。

网友(2):

应该选A。
虽然s1的空间不够但是调用strcpy函数是不会检查溢出的。就算检查溢出也是占用的s2的空间,不影响别的变量。
对于选项B,由于s4是个指针所以在内存中只分配了4个字节的空间,其中放的是一个指向常量区的地址。这个常量区的地址中就放着"string2",常量区是不允许被访问来改变值的,也就是不允许用户来写。
对于选项C,s3只是一个指针,在内存中就占了4个字节,而且是用来存放地址的,strcpy函数的第一个参数是指向一个内存空间的指针,因此这个也是错的。
对于选项D,在strcpy函数中,定义的第二个参数必须是以null结尾的字符串,而s2只是个没有定义的字符数组,因此也是不对的。

网友(3):

都不正确
a越界
b非法访问
c无空间
d源字符串无法获得长度

网友(4):

实践出真知,你写段代码验证下不就有答案了嘛!