array [index] = 0的目的是什么?

时间:2015-07-30 10:10:44

标签: c arrays string

char dev[20] = "dev_name";
char dest[32];
strncpy(dest,dev,sizeof(dev));
dest[sizeof(dev)-1] = 0;

dest[sizeof(dev)-1] = 0;的含义是什么?

2 个答案:

答案 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 必须具有空终止。

0NULnull的{​​{3}}。所以,基本上,你将一个空终止符放到char数组。