字符空间操作类
题目 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
。