字符空间操作类
题目 1
题目:如下代码运行后会产生什么结果?为什么?
char str[10];
strcpy(str,"0123456789");
答案: 因为双引号自带一个 \0
,而 str
只声明了 10
个空间,但是需要拷贝的字符长度为 11
。所以会出现越界问题,但是不同编译器不同平台上越界造成的结果不同,我们要避免上述错误的发生。
题目 2
题目:请写出以下 str
变量的 sizeof
、strlen
的大小:
char str[] = "12345";
char str[10] = {'1','2','3','4','5'};
char str[] = {'1','2','3','4','5'};
答案:
第一行: sizeof
为 6
,因为要加上 \0
;strlen
为 5
,因为 strlen
只要碰到 0
就会停止读入。
第二行: sizeof
为 10
,因为已经定义了数组的大小;strlen
是随机的,因为这个定义有可能被定义在局部变量,即会被放入栈空间中,我们不知道定义完前五个数之后后面空间在内存中存的东西是什么。当然,如果被定义到全局变量,系统会自动给后面赋值为 0
,strlen
遇到 0
就会停下,这样输出的结果就会是 5
。
第三行: sizeof
为 5
;strlen
和上面那一个理由相同,同样是随机的,不清楚后面在内存中是否还有内容。
题目 3
题目:以下代码运行后会出现什么问题?打印结果是什么?
void main(){
char abc[10];
printf("%d", strlen(abc));
}
答案: 这题和上题有点相似,因为 abc
被定义到局部变量之中,所以会被放到栈空间去,数组中的值在内存中就会不确定。但是,如果将其定义在全局变量,就会自动将所有数组值初始化为 0
,答案也会输出为 0
。