char dev[20] = "dev_name";
char dest[32];
strncpy(dest,dev,sizeof(dev));
dest[sizeof(dev)-1] = 0;
dest[sizeof(dev)-1] = 0;
的含义是什么?
答案 0 :(得分:2)
是否意味着该数组的所有元素都被赋值为零?
不,这并不意味着这一点。
假设您在最后一行中表示strncpy(dest,dev_name,sizeof(dev_name)); /* Extra bracket */
和dev_name
以及sizeof
;您正在将NUL字符分配给最后一个以标记名称数组的结尾。
当您编写类似" foo"的字符串文字时,编译器会自动终止NUL。当你使用自己的数组时,有时需要手动标记字符串的结尾。
来自man strncpy
strncpy()函数类似,除了src的最多n个字节 被复制。警告:如果前n个字节中没有空字节 对于src,置于dest 中的字符串不会以空值终止。
显式地添加了null终止以处理代码片段中的警告案例。
dev_name[0]
,dev_name[1]
,dev_name[2]
等是字符串的第一,第二,第三......字符。假设设备名称少于31个字符,则在strncpy
后自动终止NUL并且您不需要执行任何操作。
如果名称具有正好31
个字符,则最后一个字符字符(32 nd )已经是'\0'
(ascii代码0)并且再次在其上写0不会任何差异。
如果名称的字符数超过31
(极区大小写),则最后一个字符不是NUL而dev_name[sizeof(dev_name)-1] = 0;
将使名称NUL终止。
答案 1 :(得分:2)
在您的代码中,假设size
类似于sizeof
,
dev_name[size(dec_name)-1] = 0;
dev_name[size(dec_name)-1]
指向数组的最后一个元素,请记住C
数组使用基于0
的索引。
然后,根据定义,c中的字符串是一个char
数组, null-termination,所以如果你想使用一个char数组作为 string ,必须具有空终止。
0
是NUL
或null
的{{3}}。所以,基本上,你将一个空终止符放到char
数组。