strncpy_s越界?

问题遇到的现象和发生背景
用代码块功能插入代码,请勿粘贴截图
char* pathname = "/usr/temp/";
char* filename = "abcde";
char* pathname_2 = (char*)malloc(strlen(pathname));

if (pathname_2 == NULL)
{
    printf("Can't get memory for that many values.\n");
    exit(EXIT_FAILURE);
}

int a = strlen(pathname_2); printf("strlen(pathname_2) = %d\n", a);
printf("pathname_2 = %s\n", pathname_2);
strncpy_s(pathname_2, strlen(pathname_2), pathname,strlen(pathname));
printf("pathname_2 = %s\n", pathname_2);
strcat_s(pathname_2, strlen(pathname_2) + strlen(filename) + 1, filename);
int b = strlen(pathname_2); printf("strlen(pathname_2) = %d\n", b);
printf("pathname_2 = %s\n", pathname_2);

free(pathname_2);
pathname_2 = NULL;
运行结果及报错内容

img

img

这是我malloc 16个字节的内存空间

img


可以看到申请的空间全为cd,后面多4个字节的fd
当我使用strncpy_s后

img


结束符后面的内存会全变fe,我认为这是后面释放内存出问题的关键,但我不知道为什么
手动把最后4个字节置fd后,就不会警告了

img

int a = strlen(pathname_2);
这里是有问题的,因为pathname_2字符串你没有初始化啊。所以strlen会一直搜索到第一个字符串结束符'\0'为止,实际长度可能为任何数,比如0。
a的值你继续用strlen(pathname)就行了