一道C语言关于字符串和指针的选择题

来源:百度知道 编辑:UC知道 时间:2024/06/24 12:06:29
以下正确的程序段是:()
A. char str1[]="12345",str2[]="abcdef"; strcpy(str1,str2);
B. char str[10],*st="abcde"; strcat(str,st);
C. char str[10]="", *st="abcde"; strcat(str,st);
D. char *st1="12345", *st2="abcde"; strcat(st1,st2);

答案是C,为什么呀?能不能请高手把各个选项的错误解释一下?

A.
str1指向的是12345+'\0'这6个字节
str2指向的是abcdef+'\0'这7个字节
我们假设紧接着str1的6个字节的后面,存有一个别的变量str3,
那么如果把7个字节拷贝到6个字节的位置,多出来的那个字节就会影响到后面的str3。

B.
str[10]在建立以后,实际上已经存有东西了,只是一些系统的乱码,你可以打印它试试
所以如果使用strcat进行连接,实际上是从那些乱码的后面开始连接的,
然后就会出现A里面那个问题,连接完的字符串超出了str的范围了

C.
str[10]=""说明现在str里面没有东西,所以连接st的时候,是从str[0]开始连接的。
str的空间足够放入st的那些字符,所以OK~

D.
这个和上面的问题是一样的

PS:一楼的回答。。有些问题哈。。。。

D的问题和A的问题是不一样的。
D中str1的用字符串常量来初始化的,由于str1是指针,所以不会给它分配存储字符串的内存,它指向的是一个字符串常量,就是说它指向的是静态内存,后面strcpy时要修改这段静态内存,所以就出错了。

char str1[]="12345":给str1数组分了6个字节的内存(在栈里)
char *st1="12345":并没有分配内存,str1指向字符串"12345"的首地址(在静态存储区里,即代码区,它是代码的一部分)。

A 不能这样声明,中括号中必须有数字
B strcat的两个字符串必须以\0字符结尾,而单声明并不能保证
D 这个问题不懂怎么解释。。。就是不行这样,可能造成奇特的错误

abd错误都一样,就是str1/str/st1的空间不够,会造成缓冲区溢出