You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:01:05