求助!!!!关于指针和形参的问题

猴头 2010-07-09 01:04:28
 void Func ( char str[100] )
{
 sizeof( str ) = ? str此时是数组名也是四个字节(其实是4)
}

Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
(这句话什么意思啊???)
数组名不是常量吗,其值不能进行改变,但是为什么这里说可以进行自增自减运算呢?如果一个实参a[],把a传递给Func函数之后,在函数里面,a能进行赋值,自增自减运算吗??
void GetMemory1( char *p, int num)
{
p= ( char* )malloc(num);
}
void Test1( void )
{
char* str=NULL;
GetMemory1(str, 100 );
strcpy(str, " hello world " );
printf(str);
}
这段代码运行后为什么会导致系统崩溃啊。" hello world "为什么不能拷贝到str里面??
char * GetMemory4( void )
{
char *p=" hello world " ;
return p;
}
void Test4()
{
char *str=NULL;
str=GetMemory4();
printf(str);
}
这段代码中,*P是局部变量,GetMemory4调用结束后*p会被销毁,但是P的地址为什么能成功返回
char *GetMemory5( void )
{
char *p=( char* )malloc( 100 );
strcpy(p, " hello world " );
return p;
}
void Test5()
{
char *str=NULL;
str=GetMemory5();
printf(str);
free(str);
}
这段代码中GetMemory5函数中的P指针没有被初始化,strcpy(p, " hello world " );
会不会篡改了内存内容???

小弟基础知识太过薄弱,请各位指教,会有这方面的详细讲解资料,也请不吝分享,谢谢
...全文
160 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zeilone 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 yan_hyz 的回复:]
Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。
(这句话什么意思啊???)[/Quote]
函数的形参列表中声明的数组在编译时会退化为指针
也就是说 Func(char str[100])跟Func(char *str)是完全一模一样的
van_lin 2010-07-09
  • 打赏
  • 举报
回复
 void Func ( char str[100] )
{
 sizeof( str ) = ? str此时是数组名也是四个字节(其实是4)
}

如果要正常使用,还是

// 按下面这样编译器会检查传递参数 数组大小

void Func(char (&str)[100])
{
sizeof( str ) = 100 str此时是数组名也是四个字节(其实是4)
}
猴头 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zorro1x1 的回复:]
数组名其实就是一个内存中的址,地址的增减其实就是内存地址的增减
[/Quote]数组名不是一个常量吗
zorro1x1 2010-07-09
  • 打赏
  • 举报
回复
数组名其实就是一个内存中的址,地址的增减其实就是内存地址的增减
猴头 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dinghing 的回复:]
<<高质量编程>>
[/Quote]是不是林锐编的??
  • 打赏
  • 举报
回复
void Test1( void )
{
char* str=NULL; //str只是一个指针,没申请内存
GetMemory1(str, 100 ); //估计你这个GetMemory1没写好,第一个形参必须是副本,不然死的很难看,里面内存泄漏,外面内存越界。
strcpy(str, " hello world " );
printf(str);
}
  • 打赏
  • 举报
回复
void Func ( char str[100] )
{
 sizeof( str ) = ? str此时是数组名也是四个字节(其实是4)
}

数组名在传递参数的时候退化为指针,这个时候你把str看出一个char *指针即可。
lylm 2010-07-09
  • 打赏
  • 举报
回复
同意3楼,详细的讲解google 高质量C++/C编程指南
猴头 2010-07-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 van_lin 的回复:]
C/C++ code

void GetMemory1(char *&p, int num) //来改改代码 加上一个 &
{
p= (char*)malloc(num);
memset(p, 0, num);
}
void Test1( void )
{
char* str=NULL;
GetMemory1(str, 100);
str……
[/Quote]void GetMemory1(char *&p, int num) //来改改代码 加上一个 &
char *&P这个表示的是什么啊?什么含义?
dinghing 2010-07-09
  • 打赏
  • 举报
回复
<<高质量编程>>
pengzhixi 2010-07-09
  • 打赏
  • 举报
回复
去搞本C和指针的书吧
van_lin 2010-07-09
  • 打赏
  • 举报
回复

void GetMemory1(char *&p, int num) //来改改代码 加上一个 &
{
p= (char*)malloc(num);
memset(p, 0, num);
}
void Test1( void )
{
char* str=NULL;
GetMemory1(str, 100);
strcpy(str, " hello world " );
printf(str);
}


这样就行了.
blastorm 2010-07-09
  • 打赏
  • 举报
回复
数组作为函数参数, 会自动退化为指针的,所以sizeof( str ) = 4;

void GetMemory1( char *p, int num)
{
p= ( char* )malloc(num);
}
P在函数内部,是成功分配到内存的,但要注意的是,指针*p在此也是传值的,所以在函数内部对P的操作也只是对其副本作用而已,不能真正作用到实参。所以函数返回后,指针P还是不变,然后就发生内存泄露了。。。再对P赋值当然会崩溃了。

在这里需要区别对指针指向的内容修改与对指针本身修改。


  • 打赏
  • 举报
回复
这段代码运行后为什么会导致系统崩溃啊。" hello world "为什么不能拷贝到str里面??
str其实根本没有被分配空间

数组在函数参数中就变为指针

楼主这些问题,在高质量编程里面就有详细讲解
  • 打赏
  • 举报
回复
GetMemory5中strcpy(p, " hello world " );就是将p的值设为hello world

一般直接char *p = ..malloc(..)这样也算初始化

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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