【问题标题】:"Warning: assignment from incompatible pointer type" when using a double pointer使用双指针时的“警告:来自不兼容的指针类型的赋值”
【发布时间】:2013-06-21 02:05:26
【问题描述】:

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

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?

感谢您的帮助!

【问题讨论】:

标签: c pointers warnings compiler-warnings


【解决方案1】:

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

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

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

ptr=files;

【讨论】:

    【解决方案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"};
    

    【讨论】:

    • 这样声明会给出完全相同的警告
    猜你喜欢
    • 1970-01-01
    • 2011-06-21
    • 2016-09-16
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2019-06-09
    相关资源
    最近更新 更多