使用双指针时“警告:从不兼容的指针类型分配”

时间:2013-06-24 14:12:39

标签: c pointers warnings compiler-warnings

我有一个关于警告“从不兼容的指针类型分配”的问题。为什么以下代码

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?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这与

这一事实有关
const char files[][128]={"file1","file2","file3"};

使files类型的const char [][128]等同于const char (*)[128]类型。

在这种情况下,您的数据以每个字符串128个字符为单位进行布局。解除引用files会找到一个包含128个字符的块。

在对比上,char **期望在解除引用时找到一个指向char的char *指针数组。如果您希望fileschar **兼容,则必须将其声明为

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;