关于指针与数组,进来看看!

whut_lcy 2010-09-10 09:58:29
//
void getstring(char **p)
{
strcpy(*p,"Hello,World!");
}

int main()
{
//测试代码1
char arr[100] = {0};
getstring((char**)arr);

printf(arr);

//测试代码2
char arr[100] = {0};
char *p = arr;
getstring((char**)&p);

printf(arr);

}


以上程序会有什么结果?why?欢迎讨论
...全文
187 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fireyou 2010-09-10
  • 打赏
  • 举报
回复
我是来学习的,哈
wyfwx 2010-09-10
  • 打赏
  • 举报
回复
代码该这样,俺觉这样才是常规写法:
void getstring(char *p)
{
strcpy(p,"Hello,World!");
}

int main()
{
//测试代码1
char arr[100] = {0};
getstring((char*)arr);

printf(arr);

//测试代码2
char arr[100] = {0};
char *p = arr;
getstring((char*)p);

printf(arr);

}
FengRider 2010-09-10
  • 打赏
  • 举报
回复
arr哪里来的左值,它就是个数组名,可以用arr表示arr[0]的地址,即使用&arr也是取的arr[0]的地址,而arr[0]是一个char型,如果试图对char型进行char *的操作,不出错才见鬼了。
alexhilton 2010-09-10
  • 打赏
  • 举报
回复
还别说,真说不清楚!
但是很少见人这么用。有点诡异
wyfwx 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hai040 的回复:]
就算加个&
*(char**)&arr还是0
[/Quote]

you are right!

char a[100] = {0};
char **p;
char *p2;
p = (char **)&a;
p2 = *p;

p 不为0
p2 为 0
hai040 2010-09-10
  • 打赏
  • 举报
回复
就算加个&
*(char**)&arr还是0
guzhijie1981 2010-09-10
  • 打赏
  • 举报
回复
第1个虽然是段错误;
把指向char的指针强制转换成char**;不出问题才怪呢;
记住数组名字是指向第一个元素的指针;。。。。。
vipvvv 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hai040 的回复:]
*arr=0
strcpy(*p,"Hello,World!");
=
strcpy(0,"Hello,World!");
[/Quote]
所以测试代码1出错
在测试代码2中传递的是
strcpy(p,"Hello,World!");
因此是可以正确输出的
wyfwx 2010-09-10
  • 打赏
  • 举报
回复
我在vc上试了下, &a不是0

getstring((char**)&arr);做了strcpy才会出错,估计是编译器防止修改数组的地址做的保护
hai040 2010-09-10
  • 打赏
  • 举报
回复
*arr=0
strcpy(*p,"Hello,World!");
=
strcpy(0,"Hello,World!");
FengRider 2010-09-10
  • 打赏
  • 举报
回复
char arr[100] = {0};
getstring((char**)arr);

这段代码有问题,arr是一个字符数组,可以用arr表示该数组第一个元素的地址,如果arr被强制转化为char **类型,则在getstring中对参数arr进行二级指针操作时引问题。
wyfwx 2010-09-10
  • 打赏
  • 举报
回复
就 Hello,World 这11个byte是不会出问题的,运行结果Hello,World
pengzhixi 2010-09-10
  • 打赏
  • 举报
回复
getstring((char**)arr);//出问题是迟早的事
liutengfeigo 2010-09-10
  • 打赏
  • 举报
回复
有啥好讨论的
whut_lcy 2010-09-10
  • 打赏
  • 举报
回复
先不要运行代码,直接分析结果!
Thirty 2010-09-10
  • 打赏
  • 举报
回复
第二个可以
bobo364 2010-09-10
  • 打赏
  • 举报
回复
第一个内存越界,直接退出了,第二个正常打印
#include<stdio.h>
void getstring(char **p)
{
strcpy(*p,"Hello,World!");
}

int main()
{
//测试代码1
char arr[100] = {0};
getstring((char**)arr);

printf(arr);

system("pause");
return 0;
}


#include<stdio.h>
void getstring(char **p)
{
strcpy(*p,"Hello,World!");
}

int main()
{


//测试代码2
char arr[100] = {0};
char *p = arr;
getstring((char**)&p);


printf(arr);
system("pause");
return 0;
}
Q446512799 2010-09-10
  • 打赏
  • 举报
回复
Hello ,MM~~
jokenit 2010-09-10
  • 打赏
  • 举报
回复
编译看看不就得了...
qrp_pig 2010-09-10
  • 打赏
  • 举报
回复
数组和指针不相等:
&arr 和 &p

&arr用来去一个常量的地址,arr指向内存空间的地址,&arr取内存地址的地址会产生错误;
&p用来取一个变量的地址,p的内容arr,但是p本身是一个存储地址的变量,可以取地址操作;

记得K&R说过,在设计C语言时有一个突破,就是对数组的理解为指针+下标的偏移,以此简化了编译器,但是数组和指针是不完全相等。

我想这就是编译器没有报警,但是实际运行出段错误的原因;

另外(char **)的作用,等高人回答?不会是类型转换吧,呵呵

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧