- #include <string.h>
- #include <stdio.h>
- int main()
- {
- char s1[] = "hahaha";
- char *s2 = "*******/n";
- strcat(s1, s2);
- printf("S1 bytes = %d/n", sizeof(s1));
- printf("s1 = %s", s1);
- return 0;
- }
当s2增加字节数时,为什么会出现段错误?
char s1[] = "hahaha";这样申明的变量"hahaha"是只读的(文字常量区),但s1在栈区是将字符都复制过去了。
char s1[] = {'h', 'a', 'h', 'a', 'h', 'a', '/0'};
char s1[] = "hahaha";
char s1[7] = {'h', 'a', 'h', 'a', 'h', 'a', '/0'};
char s1[7] = "hahaha";
这里的等号不是简单的赋初值,而是将字符串里的内容复制到数组中。对象的实质仍然是 char 数组。
这个数组容量有限,对其进行 strcat() 将溢出。
解决的方法:申请一个更大的数组,显式指定它的容量。如s1[10000]
s1为什么不能是char *s1= "hahaha";
s1是指针,指向 "hahaha" 这个字符串常量。对字符串字面值(string literals)进行写操作,其结果是无定义的。(就是说不能到文字常量区去追加,这也就是为什么说""中的都是只读的)