免费注册 查看新帖 |

Chinaunix

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

[C] 这个程序为什么报错? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-17 17:46 |只看该作者 |倒序浏览
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 17:49 |只看该作者
请各位高手给回答一下

论坛徽章:
0
3 [报告]
发表于 2010-09-17 18:14 |只看该作者
  1. void test(char ***str)
复制代码
改成
  1. void test(char *str[2][2])
复制代码
就可以了

论坛徽章:
0
4 [报告]
发表于 2010-09-17 18:17 |只看该作者
我试试,谢谢

论坛徽章:
0
5 [报告]
发表于 2010-09-17 18:19 |只看该作者
  1. void test(char ***str)
  2. {
  3.     str[0][0] = strdup("hello");
  4. }
复制代码
等价于

  1. char **p = *str; /// 着个没有问题
  2. *p = strdup("");  /// 问题在这。
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-09-17 18:25 |只看该作者
  1. void test(char *str[2][2])
  2. {
  3.     str[M][N] = strdup("hello");
  4. }
复制代码
等价于

  1. *(str+ M*2 + N) =  strstrdup("hello");  //如当str==0x8000,M==2 N==1时,
  2.                                          //这句就是*(0x8014) = strdup();

复制代码

论坛徽章:
0
7 [报告]
发表于 2010-09-17 18:34 |只看该作者

  1. typedef char *(*matrix)[2][2];

  2. struct group
  3. {
  4.     char *a[2][2];
  5. };

  6. void test(char ***str)
  7. {
  8.     matrix tmp = &str;
  9.     (*tmp)[0][0] = strdup("hello");
  10. }

  11. int main(void)
  12. {
  13.     struct group *g = malloc(sizeof(struct group));

  14.     test(g->a);

  15. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-09-17 18:39 |只看该作者
或者

  1. typedef char *(matrix)[2][2];

  2. struct group
  3. {
  4.     char *a[2][2];
  5. };

  6. void test(matrix str)
  7. {
  8.     str[0][0] = strdup("hello");
  9. }

  10. int main(void)
  11. {
  12.     struct group *g = malloc(sizeof(struct group));

  13.     test(g->a);

  14. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2010-09-18 02:35 |只看该作者
当str的类型是char ***时,str[0][0]被解释为str[0]处存的是一个地址,str[0][0]是str[0]地址指向的内容,这个内容在这里很不幸的是0,这里是要写入0地址,所以发生了段错误。

编译器不再把二级及以上指针按照数组的方式操作,而是一步步的按照指针的方式去解释。

一个解决办法是局部进行一下转换,上面有哥们提到了,或者自己使用指针偏移的方式操作。

数组虽然可以退化成指针,但二级和二级以上指针不能进化成数组。
  1.   
  2. int ** t = malloc(100);
  3. t[0][0]=1;
复制代码
这样的代码一样错。

论坛徽章:
0
10 [报告]
发表于 2010-09-18 14:11 |只看该作者
当str的类型是char ***时,str[0][0]被解释为str[0]处存的是一个地址,str[0][0]是str[0]地址指向的内容,这 ...
cjacker 发表于 2010-09-18 02:35



    str[0][0]是str[0]地址指向的内容,这个内容在这里很不幸的是0               为什么这里的内容是零?  还不是很清楚,str[0][0]不是相当于char *吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP