关于strcat函数,该怎么解决

关于strcat函数
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;
}