【问题标题】:C Pointers and Arrays Incompatible TypesC 指针和数组不兼容的类型
【发布时间】:2012-09-22 19:55:40
【问题描述】:
所以我想知道为什么我不能这样做。
int main(int argc, char **argv){
FILE *src;
char filePath[261];
filePath = argv[1];
最后一行是编译器错误。 char[] 和 char* 有什么区别?我将如何修复此代码,以便我可以将 filePath 设置为等于 argv[1]。
提前致谢。
【问题讨论】:
标签:
c
arrays
pointers
types
【解决方案1】:
使用
strcpy(filePath, argv[1]);
并快乐地生活。不要忘记检查 argv[1] 是否为 NULL,并且不要忘记查看 argc 是否 > 1。
您的filePath 变量是一个固定大小的数组,分配在堆栈上,而 argv[i] 是指向堆中某些内存的指针。无法赋值给filePath,因为filePath不是指针,而是数据本身。
【解决方案3】:
你需要:
FILE *src;
char *filePath;
filePath = argv[1];
因为filePath 必须指向 到 argv,而不是 261 字节的数组。如果需要,您可以将参数i 复制到数组中:
FILE *src;
char filePath[261];
strcpy(filePath, argv[1]);
或更好,以避免复制比您可用的更多字节的风险(这将导致灾难):
FILE *src;
char filePath[261];
strncpy(filePath, argv[1], sizeof(filePath));
或再次
#define MAX_FILESIZE 261
FILE *src;
char filePath[MAX_FILESIZE];
strncpy(filePath, argv[1], MAX_FILESIZE);
【解决方案4】:
问:char[] 和 char* 有什么区别?
答:很多时候,您可以互换使用它们。
但是在这里,您“尝试将数组名称用作左值”:)
这里有一个很好的解释:
以下是“什么是合法的,什么是不合法的”的简短摘要: