先上例子:
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出现越界时,即使有时会正常输出(因为其后连续的地址空间为空,结束了操作),但已造成越界错误(若后续内存申请,其后地址被分配,地址空间内容不为空,造成越界访问)。