char * filenames [1]或char * filenames有什么区别?

时间:2015-11-04 09:47:38

标签: c arrays linux pointers

我正在编写一个程序,它将文件名列表存储为字符串数组。当我宣布它为

char *filenames[1]

我没有错误......但是当我这样做时

char *filenames 

我收到一些错误。不是在声明,而是在以后使用。例如,当我这样做时:

filenames[3]= (char*)malloc( strlen(line) + 1);//here ERROR is : Cannot assign char* to char.

但是随着[1]的第一次声明,一切都很好。我只是想知道它们之间有什么区别?

相信我,我试图在谷歌上寻找答案,但无法找到有关此案例的任何好消息。

2 个答案:

答案 0 :(得分:1)

首先,char *filenames表示名为char *的{​​{1}}变量,而filenames表示char *filenames[1]变量数组,包含一个元素。

从使用的角度来看,两者都是相同的,但主要区别在于,第一个必须用作普通变量,第二个可以作为数组索引。

如果您只需要使用一个变量,请不要使用数组。如果您不够小心,可能会有使用超出索引的危险。

另外,作为备注,please see this discussion on why not to cast the return value of malloc() and family in C.

答案 1 :(得分:1)

相对于此声明

filenames[3]= (char*)malloc( strlen(line) + 1);//here ERROR is : Cannot assign char* to char.

这两个声明都是错误的。

firwt声明

char *filenames[1]

是错误的,因为它声明了一个只有一个元素的char指针数组。但是在具有内存分配的语句中,使用了索引3。因此,尝试访问数组之外​​的内存,因为具有一个元素0的数组的唯一有效索引。

第二个声明

char *filenames 

是错误的,因为它没有声明指针数组。因此,对标识符filenames

应用下标运算符
filenames[3]

给出类型为char的标量对象,而不是char *类型的指针