我正在编写一个程序,它将文件名列表存储为字符串数组。当我宣布它为
时char *filenames[1]
我没有错误......但是当我这样做时
char *filenames
我收到一些错误。不是在声明,而是在以后使用。例如,当我这样做时:
filenames[3]= (char*)malloc( strlen(line) + 1);//here ERROR is : Cannot assign char* to char.
但是随着[1]的第一次声明,一切都很好。我只是想知道它们之间有什么区别?
相信我,我试图在谷歌上寻找答案,但无法找到有关此案例的任何好消息。
答案 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 *
类型的指针