C语言中数组赋值给指针时出现“incompatible type”警告问题排查
解决C语言“不兼容指针类型”警告问题
嘿,这个警告的根源其实是你对list1的类型判断有误哦~
你觉得list1是char*类型,但实际上它是字符指针数组(类型为char *[])。当你在代码里写p = list1时,数组名list1会自动退化为指向数组第一个元素的指针,也就是char **类型;而如果你的p是声明成char *p的话,这俩类型自然不兼容,编译器就会抛出警告啦。
两种修正思路:
思路1:修正指针类型匹配
如果你的目的是让p指向整个单词列表(也就是数组本身),那要把p的声明改成char **p,这样就能和list1退化后的char**类型匹配:void test() { char *list1[] = {"apple", "banana", "cherry"}; char *list2[] = {"dog", "cat", "bird"}; char **p; // 这里改成char**类型 srand(time(NULL)); if (rand() % 2 == 0) { p = list1; // 现在类型匹配了 } else { p = list2; } // 后续可以通过p[index]访问列表里的单词 printf("%s\n", p[rand() % 3]); }思路2:直接指向单个单词
如果你的最终目的是随机选中列表里的一个单词(而不是指向整个列表),那应该先确定选哪个列表,再随机取列表里的元素赋值给char*类型的p:void test() { char *list1[] = {"apple", "banana", "cherry"}; char *list2[] = {"dog", "cat", "bird"}; char *p; // 保持char*类型 srand(time(NULL)); if (rand() % 2 == 0) { p = list1[rand() % 3]; // 直接取list1里的随机单词 } else { p = list2[rand() % 3]; // 直接取list2里的随机单词 } printf("%s\n", p); }
这样修改后,编译器的“不兼容指针类型”警告就会消失,代码逻辑也更贴合你的需求啦~
内容的提问来源于stack exchange,提问作者thatsagoal
相关产品推荐
相关产品推荐

