免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1570 | 回复: 3
打印 上一主题 下一主题

这个为什么会报错呢?????????????? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-17 17:51 |只看该作者 |倒序浏览
struct group
{
    char *a[2][2];
};

void test(char ***str)
{
    str[0][0] = strdup("hello");
}

int main(void)
{
    struct group *g = malloc(sizeof(struct group));

    test(g->a);

}

论坛徽章:
0
2 [报告]
发表于 2010-09-17 19:59 |只看该作者
void test(char ***str) 这个函数的声明与实际的调用形式不一致...
形参char ***str只是说明str是一个三级指针... 而你的调用形式是g->a。实参的确可以看做是一个三级指针。
这没错... 可是你在test()函数中直接用str[0][0]。这是二维数组的用法... 但根据str的声明, 编译器并不知道
str是一个二维数组。 所以就报错...因为这样编译器无法编译...
比如你用 str[1][1] = strdup("hello"); 这个str[1][1]究竟怎么寻址编译器是无法知道的。
因为对str[N][N]. n不同 str[1][1]寻址的地址就不同...
你可以将test 原型声明为void test(char *str[2][2]) 明确的告诉编译器str是一个2X2的二维数组.其元素为指向char类型的指针。
或者用强制类型转换. 将str[0][0] 换成 (char *)
应该就不会报错了...

论坛徽章:
0
3 [报告]
发表于 2010-09-17 20:44 |只看该作者
多谢

论坛徽章:
0
4 [报告]
发表于 2010-09-19 10:51 |只看该作者
另外,group里的每个字符串都没有分配空间,存在隐患。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP