免费注册 查看新帖 |

Chinaunix

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

[函数] 问一个函数参数的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-16 20:26 |只看该作者 |倒序浏览
有这么如下一个程序:
#include <stdio.h>
#include <iostream>

using namespace std;

void setTime(char **sStime)
{
        char sDate[] = "2090";
        strcpy(*sStime,sDate);
}

void setTime1(char *&sStime)
{
        char sDate[] = "3090";
        strcpy(sStime,sDate);
}

int main()
{
    char  *sStime = NULL;
    cout<<"开始测试"<<endl;
    sStime = new char[30];
    setTime(&sStime);
    printf("%s\n",sStime);
    setTime1(sStime);
    cout<<sStime<<endl;
   
    return 0;
}
以上执行是没有问题的,
但是改成如下的形式,却报错,为什么呢?

int main()
{
    char  sStime[30] = "0";
    cout<<"开始测试"<<endl;
    setTime(&sStime);
    printf("%s\n",sStime);
    setTime1(sStime);
    cout<<sStime<<endl;
   
    return 0;
}

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-03-17 08:34 |只看该作者
  1. #include <cstring>

  2. void SetTime( char* sStime )
  3. {
  4.         strcpy( sStime, "2090" );
  5. }

  6. #include <iostream>
  7. using namespace std;

  8. int main()
  9. {
  10.         cout << "开始测试" << endl;

  11.         char stime[30];
  12.         SetTime(stime);
  13.         cout << stime << endl;

  14.         char* pstime = new char[30];
  15.         SetTime(pstime);
  16.         cout << pstime << endl;

  17.         return 0;
  18. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-03-17 09:07 |只看该作者
兄弟,你这种改法,你可以试试看,是获取不到里面的值的。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
4 [报告]
发表于 2011-03-17 09:18 |只看该作者
关于数组名的问题:数组名在编译器看来是个内存地址常量,存储地址是不存在的。因此对数组名取地址是没有任何意义的。但语义派认为对数组名取地址从语义上来看就是变数组为指针并且增加指针的维数。
这个问题目前还在争论中……

论坛徽章:
0
5 [报告]
发表于 2011-03-17 09:22 |只看该作者
传递参数的基本规则是

char *:调用方分配内存,调用方释放内存,函数只管修改其内容

char **:函数分配内存,调用方提供指针接收该内存即可,并且使用完之后由调用方释放该内存


至于你一定要明白为什么传数组名地址修改为什么不行,我也不知道。。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
6 [报告]
发表于 2011-03-17 09:23 |只看该作者
内存分配的原则是:谁分配,谁释放。

论坛徽章:
0
7 [报告]
发表于 2011-03-17 11:06 |只看该作者
问题可能出在 对 数组取引用上 这个用法不一定成立 》。。

论坛徽章:
0
8 [报告]
发表于 2011-03-17 13:16 |只看该作者
回复 6# cobras


    通用的规则是这样,不过还是有很多库是分配完了要你调用方释放的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP