0

我对警告“来自不兼容的指针类型的赋值”有疑问。为什么下面的代码

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 in compatible pointer type when using pointers and arrays?

谢谢您的帮助!

4

2 回答 2

2

这与以下事实有关

const char files[][128]={"file1","file2","file3"};

make filesof typeconst char [][128]等价于 type const char (*)[128]

在这种情况下,您的数据以每个字符串 128 个字符的块形式排列。取消引用files会找到一个 128 个字符的块。

相反,a期望在取消引用时找到指向 char 的指针char **数组。char *如果你想files兼容,char **你必须将其声明为

const char * files[]={"file1","file2","file3"};
于 2013-06-24T14:21:06.047 回答
1

files有类型char (*)[128],没有char**;没有第二级指针(我们还没有谈论const它;这是另一个蠕虫罐头)。

此代码不应显示警告(常量除外)

const char files[][128]={"file1","file2","file3"};
char (*ptr)[128];

ptr=files;
于 2013-06-24T14:19:54.873 回答