免费注册 查看新帖 |

Chinaunix

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

[10分请教]一个奇怪的指针字符串问题,跳舞吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-06 23:27 |只看该作者 |倒序浏览
我有这么一段小程序,用来试验2维字符串数组的传递:
#include<stdio.h>
#include<string.h>
void f(char (*c)[2][4]){
  printf("c[0]=%s,c[1]=%s\n",*(c[0]),*(c[1]));
  strcpy(*(c[0]),"123");
}
int main(){
  char buf[2][4]={"xyz","abc"};
  printf("size=%d\n",sizeof(buf));
  printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
  f(&buf);
  printf("after f()\n");
  printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
  return 0;
}

编译并运行,发现在函数f的内部,打印的第二个字符串每次都是不同的乱码
cling@d4etch:~$ gcc p.c&&./a.out
size=8
buf[0]=xyz,buf[1]=abc
c[0]=xyz,c[1]=`w뿨w뿨^
after f()
buf[0]=123,buf[1]=abc
cling@d4etch:~$ gcc p.c&&./a.out
size=8
buf[0]=xyz,buf[1]=abc
c[0]=xyz,c[1]=0

论坛徽章:
0
2 [报告]
发表于 2008-11-06 23:36 |只看该作者
f的参数c是一个指向二维数组的指针,因此c[0]指向这个二维数组,c[1]指向下一个二维数组(不存在)

修改下:
void f(char (*c)[4])
{
  printf("c[0]=%s,c[1]=%s\n", c[0], c[1]);
  strcpy(c[0], "123");
}

论坛徽章:
0
3 [报告]
发表于 2008-11-07 03:05 |只看该作者
#include<stdio.h>
#include<string.h>
void f(char c[2][4]){
  printf("c[0]=%s,c[1]=%s\n",c[0],c[1]);
  strcpy(c[0],"123");
}
int main(){
  char buf[2][4]={"xyz","abc"};
  printf("size=%d\n",sizeof(buf));
  printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
  f(buf);
  printf("after f()\n");
  printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
  return 0;
}

论坛徽章:
0
4 [报告]
发表于 2008-11-07 09:51 |只看该作者
#include<stdio.h>
#include<string.h>

void f(char *c)
{
    printf("c[0]=%.*s,c[1]=%.*s\n", 3, c, 3, c + 4);
    memcpy(c + 4, "123", 4);
}

int main(){
    char buf[2][4]={"xyz","abc"};
    printf("size=%d\n",sizeof(buf));
    printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
    char *p = (char *)buf;
    f(p);
    printf("after f()\n");
    printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
    return 0;
}

好像不是二维数组的传递,转换为指针传递了

[ 本帖最后由 cnangel 于 2008-11-7 09:54 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-11-07 10:32 |只看该作者
void f(char (*c)[2][4]){
  printf("c[0]=%s,c[1]=%s\n",(*c)[0],(*c)[1]);
  strcpy((*c)[0],"123");
}

朋友,括号打错地方了。

论坛徽章:
7
酉鸡
日期:2013-10-30 17:17:51水瓶座
日期:2014-01-25 14:47:21天秤座
日期:2014-02-20 09:49:50处女座
日期:2014-11-04 17:44:082015年亚洲杯之中国
日期:2015-03-09 17:21:312015亚冠之北京国安
日期:2015-06-01 16:58:552015亚冠之山东鲁能
日期:2015-06-19 11:30:08
6 [报告]
发表于 2008-11-07 10:49 |只看该作者
#include<stdio.h>
#include<string.h>
void f(char (*c)[2][4]){
&nbsp;&nbsp;printf("c[0]=%s,c[1]=%s\n",*(c[0]),*(c[0])+4);
&nbsp;&nbsp;strcpy(*(c[0]),"123");
}
int main(){
&nbsp;&nbsp;char buf[2][4]={"xyz","abc"};
&nbsp;&nbsp;printf("size=%d\n",sizeof(buf));
&nbsp;&nbsp;printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
&nbsp;&nbsp;f(&buf);
&nbsp;&nbsp;printf("after f()\n");
&nbsp;&nbsp;printf("buf[0]=%s,buf[1]=%s\n",buf[0],buf[1]);
&nbsp;&nbsp;return 0;
}

论坛徽章:
0
7 [报告]
发表于 2008-11-07 22:28 |只看该作者
原帖由 Roemer 于 2008-11-7 03:05 发表
#include
#include
void f(char c[2][4]){
  printf("c[0]=%s,c[1]=%s\n",c[0],c[1]);
  strcpy(c[0],"123");
}
int main(){
  char buf[2][4]={"xyz","abc"};
  printf("size=%d\n",sizeof(buf));
   ...

以上各位大虾的答案都很强大啊,不过感觉这个答案看起来最直观,分还是要送出的!
谢谢啦!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP