c语言中char *和char []

1、概念不同

c语言中没有特定的字符串类型,常用以下两种方式定义字符串:1)字符数组;2)指向字符串的指针。

char *str声明的是一个指针,这个指针可以指向任何字符串常量。
char str[]声明的是一个字符数组,数组的内容可以是任何内容,严格意义上说,末尾加上'\0'之后才能算是字符串

2、变量不同

char *strstr是指针变量,str的值未初始化(局部变量的话,全局则自动初始化为NULL
char str[]str是地址常量,str的值是str[]的地址

3、内存的分配方式不同

内存分配可分为三种:静态存储区、栈区、堆区

1、静态存储区:该内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,它主要存放静态数据、全局数据和常量

2、栈区:它的用途是完成函数的调用。在执行函数时,函数内局部变量及函数参数的存储单元在栈上创建,函数调用结束时这些存储单元自动被释放。

3、堆区:程序在运行时使用库函数为变量申请内存,在变量使用结束后再调用库函数释放内存。动态内存的生存期是由我们决定的,如果我们不释放内存,就会导致内存泄露。

char []定义的是字符串数组,该字符数组保存在全局数据区或栈区,因此数组的内容是可以改变的:

char str[6] = {"hello"}; //虽然只初始化了5个元素,但由于编译器会自动在末尾加'\0',所以size为6
str[0] = 'H'; //合法

char *定义的是字符串指针变量,该指针变量指向一个字符串,该指针的值是该字符串在内存中的地址,所以可以修改指针的值,但不能修改指针指向的值:

char *str = {"hello"};
str[0] = 'H'; //非法
4、char *作为函数返回值时

指针作为返回值时会出现:在函数返回后,指针指向的内存单元被释放了,这样就会导致指针成了野指针。

//这样会报错,因为str数组元素为局部变量,存储在栈内,函数结束后,内容失效
char* func(char* name)
{
    char str[5];
    strcpy(str,name);
    return str;
}

错误分析

str为地址,返回值为char*,是进行了值传递,没有问题,但是,数组中的元素为局部变量,存储在栈中,函数外无效。

  • 解决方法1:将数组定义为static
char* func(char *name)
{
   static char str[5];
   strcpy(str,name);
   return str;
}
  • 解决方法2:字符串为静态常量(存储在常量区)
char* func()
{
    char *str= "hello";
    //char str[]= "hello";
    return str;
}
  • 解决方法3:设置为动态数组
char* func(char* name)
{
    char *str= (char*)malloc(5*sizeof(char));
    strcpy(str,name);
    return str;
}
  • 解决方法4:设置为全局变量
char str[10];
char* func(char* name)
{
    strcpy(str,name);
    return str;
}

小结:通过以上方法,返回字符串,只要返回字符串首地址即可。

1)调用函数时,若直接输出的话,用一个字符指针接受即可:char *result = func();

2)调用函数时,若要获取返回的字符串:char result[5]; strcpy(result, func());

  • 3
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值