读书人

char*返回有关问题

发布时间: 2012-02-05 12:07:15 作者: rapoo

char*返回问题
我写了个函数:
char * a(){
char buff[] = "12345";
return buff;
}

int main(){
char * out = a();
cout << out << endl;
return 0;
}

为什么out输出的是乱码,而且字符串长度也不对?

[解决办法]
可以使用字符串常量
char * a(){
char *buff = "12345";
return buff;
}

int main(){
char * out = a();
cout << out << endl;
return 0;
}



=============
或者
char * a(){
char *buff = new char[10];
sprintf(buff,"%s","hello");
return buff;
}

int main(){
char * out = a();
cout << out << endl;
return 0;
}
[解决办法]
或者
char * a(){
char *buff = new char[10];
sprintf(buff,"%s","hello");
return buff;
}

int main(){
char * out = a();
cout << out << endl;

delete []out;
return 0;
}
[解决办法]
char * a(){
char *buff = new char[10];
sprintf(buff,"%s","hello");
return buff;
}

int main(){
char * out = a();
cout << out << endl;

delete []out;
return 0;
}
[解决办法]
这个是临时的,程序返回完就不保证了。
[解决办法]
这个关系到strlen的返回了,长度返回的时候是根据'\0'字符作为结束符的,一般我们
char *p="nihao";
它实际上存储的是"nihao\0",它会自动添\0倒末尾

char *p=new char[20];表明上是p指向一个分配到20个字节的单元,但”有效长度“是没有这么大的,正如一个string 进行系统根据元素个数进行动态分配了为m1,但实际长度一般都市<=m1的

这个char *p=new char[20];用strlen测的不是真实长度
exp: char *p=new char[20];
p="1234\05678\0";
这p是10个字符,但实际上遇到第一个\0作为结束标志,strlen(p)=5

当然 char*p =new char[20];
p[20]='\0';
这个时候再用strlen(p)就是20了

char *p=new int[20];
然后用strlen(p)这样作为参数表明p分配的单元是20个字节是不安全的,因为实际上strlen(p)!=20


可以直接用char p[20] 或者 char *p=new char[20];p[20]='\0'


(同理也有一个很多时候我们进行比如我们传递一个数组指针的时候,一般都要传递该数组长度)
void TEST(int arr[],size_t size);
因为函数传递的时候传递的是指针,传递的时候它不是传递数组,它不会知道这个指针所关联多少内存空间,
用strlen一样会引起问题,用sizeof(arr)的话这个时候测出的也不是arr数组长度,而是形参传递进来的临时指针int *p这个P的存储空间,所有sizeof(arr)=4(4个字节是这个指针所占的存储空间)
[解决办法]
char buff[] = "12345";是在栈上的
new 是在堆上的!
函数结束 栈上 的出栈 ,就释放了! 堆上的不释放,需要手动释放!

读书人网 >C++

热点推荐