关于strcat函数,该怎么解决
关于strcat函数
strcat(char* str1, char* str2);
上面这个函数是把字符串str2接到字符串str1上去,但是要保证str1有足够大的空间来存储str1和str2的总长度。
于是测试了一下,程序如下:
打印结果是:12345123456,明明结果字符串已经超出了str1的最大长度,为什么没有报错。
如果程序改成如下:
执行时结果如下:
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;
}
strcat(char* str1, char* str2);
上面这个函数是把字符串str2接到字符串str1上去,但是要保证str1有足够大的空间来存储str1和str2的总长度。
于是测试了一下,程序如下:
#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的最大长度,为什么没有报错。
如果程序改成如下:
#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;
}