Chinaunix

标题: 问一个函数参数的问题 [打印本页]

作者: linbe_ice    时间: 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;
}
作者: bruceteen    时间: 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. }
复制代码

作者: linbe_ice    时间: 2011-03-17 09:07
兄弟,你这种改法,你可以试试看,是获取不到里面的值的。
作者: cobras    时间: 2011-03-17 09:18
关于数组名的问题:数组名在编译器看来是个内存地址常量,存储地址是不存在的。因此对数组名取地址是没有任何意义的。但语义派认为对数组名取地址从语义上来看就是变数组为指针并且增加指针的维数。
这个问题目前还在争论中……
作者: 雨过白鹭洲    时间: 2011-03-17 09:22
传递参数的基本规则是

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

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


至于你一定要明白为什么传数组名地址修改为什么不行,我也不知道。。
作者: cobras    时间: 2011-03-17 09:23
内存分配的原则是:谁分配,谁释放。
作者: wb112200    时间: 2011-03-17 11:06
问题可能出在 对 数组取引用上 这个用法不一定成立 》。。
作者: 雨过白鹭洲    时间: 2011-03-17 13:16
回复 6# cobras


    通用的规则是这样,不过还是有很多库是分配完了要你调用方释放的




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2