编译C代码时出现‘Assignment from incompatible pointer type’错误求助
解决C语言中「从不兼容指针类型赋值」的错误
嘿,我来帮你搞定这个编译错误!先看你代码里触发问题的关键行:for (ip = names; *(ip + i); i++) printf("%s ", *(ip + i));
错误根源
你声明的ip是char **(指向字符指针的指针),但names是一个二维字符数组,它的类型是char *[4][11](本质是包含4个元素的数组,每个元素是长度为11的字符数组)。这俩指针类型在C语言里完全不兼容——二维数组的首地址是「指向一维数组的指针」,和「指向指针的指针」不是一回事,编译器自然会抛出类型不匹配的错误。
两种修复方案任你选
方案1:让指针类型匹配二维数组
把char **ip;改成char (*ip)[11];,这是一个指向长度为11的字符数组的指针,刚好和names的类型对上。然后调整循环逻辑(二维数组没法用*(ip + i)判断终止,直接用元素个数更稳妥):
#include <stdio.h> int main(int argc, char ** argv){ int num[] = {10, 15, 25, 30, 45, 10}; char *names[][11] = {"Drew", "Larry Page", "Seggy", "Mark"}; //int *ip, i = 0; char (*ip)[11]; // 修改指针类型为指向字符数组的指针 int *p, i = 0, j = 0; for (ip = names; ip < names + 4; ip++) printf("%s ", *ip); // 循环4次,对应names的4个元素 printf("\n\n"); for (p = num; j < sizeof(num)/sizeof(num[0]); j++) printf("%d ", *(p + j)); printf("\n"); return 0; }
方案2:改成指针数组(更常用更简洁)
如果你本来就是想存储字符串指针,其实没必要用二维字符数组,直接声明成一维指针数组就行,这样就能和char **完美兼容:
#include <stdio.h> int main(int argc, char ** argv){ int num[] = {10, 15, 25, 30, 45, 10}; char *names[] = {"Drew", "Larry Page", "Seggy", "Mark", NULL}; // 改成指针数组,末尾加NULL保证循环安全 //int *ip, i = 0; char **ip; int *p, i = 0, j = 0; for (ip = names; *(ip + i); i++) printf("%s ", *(ip + i)); // 现在类型匹配,循环也能正常终止 printf("\n\n"); for (p = num; j < sizeof(num)/sizeof(num[0]); j++) printf("%d ", *(p + j)); printf("\n"); return 0; }
这里给names末尾加了NULL,是因为字符串字面量数组不会自动补NULL,如果没加的话,循环可能会越界访问内存,加上NULL后,*(ip + i)遇到NULL就会停止,更安全。
额外唠两句:为啥这俩指针不兼容?
简单说就是内存布局不一样:
char **指向的是一个char *变量的地址,每次指针移动(比如ip++),步长是一个指针的大小(4或8字节,取决于系统);char (*)[11]指向的是11个字符组成的数组,指针移动的步长是11字节。
如果强行赋值,编译器没法保证内存访问的正确性,所以才会报错阻止你。
内容的提问来源于stack exchange,提问作者Fokwa Best
相关产品推荐
相关产品推荐

