我有一个关于警告“从不兼容的指针类型分配”的问题。为什么以下代码
const char files[][128]={"file1","file2","file3"};
char **ptr;
ptr=files;
发出此警告?更复杂的工作正常:
typedef struct
{
double **matrix;
}foo_struct;
void fun(foo_struct *foo)
{
double **ptr;
ptr=(*foo).matrix;
}
所以我真的不明白为什么第一个确实给出了这个警告,因为我认为像files [] [128]这样的东西与char ** ptr的类型相同。我看到的唯一区别是C知道有效内存区域的跨度/大小,而在第二个示例中它不知道。
这是类似的东西,但对我没有帮助:Warning about assignment from incompatible pointer type when using pointers and arrays?
感谢您的帮助!
答案 0 :(得分:2)
这与
这一事实有关const char files[][128]={"file1","file2","file3"};
使files
类型的const char [][128]
等同于const char (*)[128]
类型。
在这种情况下,您的数据以每个字符串128个字符为单位进行布局。解除引用files
会找到一个包含128个字符的块。
在对比上,char **
期望在解除引用时找到一个指向char的char *
指针数组。如果您希望files
与char **
兼容,则必须将其声明为
const char * files[]={"file1","file2","file3"};
答案 1 :(得分:1)
files
的类型为char (*)[128]
,而非char**
;没有第二级指针(我们还没有谈论const
;它是另一种蠕虫)。
此代码不应显示警告(constness除外)
const char files[][128]={"file1","file2","file3"};
char (*ptr)[128];
ptr=files;