strncat越界,踩内存

#include <string.h>
#include <stdio.h> 
#include <stdlib.h>


int main()
{
	char *a = (char *)malloc(sizeof(char) * 10);
	char w[30]="WWWWWWWWWWWWWWWWWWWWWWWWWWWW";
	printf("w[30]: %c \n", w[30]);  //越界

	memcpy(a, "123456789", 10);
	memcpy(a+10, "123456789", 10);

	for (int i = 0; i < 20; i++) {
		printf("before, %c\n", *(a + i));
	}

	strncat(a, w, 5);   // 超出a的大小
	printf("a: %s, a: %p\n", a, a);
	for (int i = 0; i < 20; i++) {
		printf("after, %c\n", *(a + i));
	}

	return 0;
}

打印

w[30]:  
before, 1
before, 2
before, 3
before, 4
before, 5
before, 6
before, 7
before, 8
before, 9
before, 
before, 1
before, 2
before, 3
before, 4
before, 5
before, 6
before, 7
before, 8
before, 9
before, 
a: 123456789WWWWW, a: 0x55e3aee24260
after, 1
after, 2
after, 3
after, 4
after, 5
after, 6
after, 7
after, 8
after, 9
after, W
after, W
after, W
after, W
after, W
after, 
after, 6
after, 7
after, 8
after, 9
after, 

 

strncat()将会从字符串src的开头拷贝n 个字符到dest字符串尾部,dest要有足够的空间来容纳要拷贝的字符串。

如果n小于字符串src的长度,那么仅拷贝n 个字符到dest字符串尾部, 字符追加完成后,再追加'\0'。

如果n大于字符串src的长度,那么仅将src指向的字符串内容追加到dest的尾部。

strncat()会将dest字符串最后的'\0'覆盖掉,字符追加完成后,再追加'\0'。

// 当使用像strncat()函数时,必须在缓冲区的末尾为终止空字符留下一个空字节,避免off-by-one
strncat(fullname, lastname, sizeof(fullname) - strlen(fullname) - 1);
#include <string.h>
#include <stdio.h> 
#include <stdlib.h>



int main()
{
	char firstname[30] = "123456789123456789";

	char fullname[10] = "**********";


	fullname[0] = '\0';
	strncat(fullname, firstname, 6);
	for (int i = 0; i < 10; i++) {
		printf("[i:%d], %c, %s\n", i, fullname[i], fullname);
	}

 
	return 0;
}

打印

[i:0], 1, 123456
[i:1], 2, 123456
[i:2], 3, 123456
[i:3], 4, 123456
[i:4], 5, 123456
[i:5], 6, 123456
[i:6], , 123456
[i:7], *, 123456
[i:8], *, 123456
[i:9], *, 123456

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值