关于strcat函数
strcat(char* str1, char* str2);
上面这个函数是把字符串str2接到字符串str1上去,但是要保证str1有足够大的空间来存储str1和str2的总长度。
于是测试了一下,程序如下:
- C/C++ code
#include <string.h>#include <stdio.h>int main(void){ char str1[10]="12345"; char *str2="123456"; strcat(str1,str2); printf("%s\n",str1); return 0;}
打印结果是:12345123456,明明结果字符串已经超出了str1的最大长度,为什么没有报错。
如果程序改成如下:
- C/C++ code
#include <string.h>#include <stdio.h>int main(void){ char str1[10]="12345"; char *str2="123456789012345678901234567890"; strcat(str1,str2); printf("%s\n",str1); return 0;}
执行时结果如下:
12345123456789012345678901234567890
Segmentation fault
为什么这边又报错了,不是应该在前面就报错么?
[解决办法]
没有报错,并不等于没有错。你可以单步跟一下,看一下内存就知道了,情况一下已经内存越界了。
情况二会异常是因为踩到别人的内存了。
[解决办法]
貌似分给内存的时候,很可能在满足你需求的基础上尽量分给你最小的一段。这一段内存后面多远是另一程序正在使用的不确定,因此往后越界多少会报错也不确定。不过确定的是,就算越界一个字节,虽然不是总报错,但是早晚会报错。
[解决办法]
VC推荐使用strcat_s函数的,有长度限制,比较安全,用strcat会报warning
[解决办法]
指针越界了,但是因为没有写到其他的程序占用的内存所以有时候不会报错。。给你个例子。
#include "stdio.h"
int main()
{
int array[4] = {1,1,1,1};
int b = 1;
int i = 0;
int *ptr = array - 1;
printf("&ptr = %d\tptr = %d\n",&ptr, ptr);
printf("&b = %d,\tarray = %d\n", &b, array);
for(i=0; i < 5; i++)
{
*ptr = 0;
printf("ptr = %d\n", ptr);
*ptr++;
}
for( i = 0; i < 4; i++)
{
printf("&array[%d] = %d,array[%d] = %d\n", i, &array[i], i, array[i]);
}
printf("b = %d\n", b);
return 0;
}