字符(字符数组)越界

先上例子:

char buffer1[32];
memset(buffer1,'\061',sizeof(buffer1));
buffer1[31] = '\0';
printf("buffer1=%s\n", buffer1);
char *buffer3 = "0123456789\0abcdef";//17
strcpy(buffer1,buffer3);
printf("buffer1=%s\n", buffer1);
printf("buffer1=%s, len_buffer1=%d, buffer1[10]=%c, buffer1[11]=%c\n", buffer1, strlen(buffer1), buffer1[10], buffer1[11]);
	
char buffer4[32];
memset(buffer4,'\061',sizeof(buffer4));
//buffer4[31] = '\0';
printf("buffer4=%s, sizeof(buffer4)=%d\n", buffer4, sizeof(buffer4));
char *buffer2 = "0123456789012345678901234567890123456789abc";//43
memset(buffer4,0,sizeof(buffer4));
strncpy(buffer4,buffer2,sizeof(buffer4));
//buffer4[31] = '\0';
printf("buffer4=%s, len_buffer4=%d, buffer4[10]=%c, buffer4[31]=%c\n", buffer4, strlen(buffer4), buffer4[10], buffer4[31]);

//例2
char start_ip[32];
char *nvram_value = NULL;
nvram_value = (char *)nvram_bufget(RT2860_NVRAM, "dhcpStart");
memset(start_ip, 0x00, sizeof(start_ip));//将内存置为空0x00(地址格式)
strncpy(start_ip, nvram_value, sizeof(start_ip));//n为目的地址大小
start_ip[UDHCPD_CONF_BUFF-1] = '\0';//将最后一位置为结束符\0

总结:

        1)start_ip[UDHCPD_CONF_BUFF-1] = '\0';
        当sizeof(nvram_value) >= sizeof(start_ip)时为满复制,结尾无结束符\0很危险(fgets读取一行时,没有结束符会将其他字符一并读取等);所以要将空间最后一位其赋值为结束符
        当sizeof(nvram_value) < sizeof(start_ip)时,dst没有占满,strncpy结束后会将剩下字符位置全部置为结束符\0
        ['1','2','3','4','\0','\0','\0','\0']
        2)一般字符串操作(包含打印字符串printf)等,都是遇到\0作为其结束操作的标志;

拓展:

        snprintf函数有越界保护;sprintf没有越界保护;
        1)snprintf如果格式化后的字符串长度小于 size,则会把字符串全部复制到 str 中,并给其后添加一个字符串结束符 \0;
        2)snprintf如果格式化后的字符串长度大于等于 size,超过 size 的部分会被截断,只将其中的 (size-1) 个字符复制到 str 中,并给其后添加一个字符串结束符 \0,返回值为欲写入的字符串长度。
        sprintf出现越界时,即使有时会正常输出(因为其后连续的地址空间为空,结束了操作),但已造成越界错误(若后续内存申请,其后地址被分配,地址空间内容不为空,造成越界访问)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值