前情提要
最近在写代码的时候,时不时会遇到类似const char* 类型的值,不能用于初始化char* 类型的实体”这样的错,可能在基础牢靠的大佬来说很简单,但是对于我这个没有系统学过C的菜鸟来说,还是有些烦的,所以这里就来小结一下。
正文 char*
首先,我先找了一些资料,找了一下char* 类型的变量可以有哪些方式可以初始化,然后就找到了以下方法:
易错写法:直接赋值(不可以)
这个是最容易出错的一种方式,这里还是给点出来一下。
char *str = "Hello, world!";
我把这段代码放到程序里,还没运行,代码底下就有个红红的波浪线,这是编辑器在告诉我有错,鼠标放上去,就看到了开头我提到的那个错误
后来我查了一下,报这个错是因为字符串字面值是常量,而 char* 类型的指针不应该指向常量,如果是const char* 那就是可以的。
好像在C++11之前,这么写是不会报错的,但是 C++11 引入了新的类型推断规则,禁止将 const char* 类型隐式转换为 char* 类型,所以就会报错。
方法一:使用动态内存分配函数 malloc 分配空间,并且在分配空间后用字符串函数给该空间赋值。
char *str = (char*)malloc(100 * sizeof(char));
strcpy(str, "Hello, world!");
代码亲测可运行,用这种方式动态内存分配出来的空间可以被修改,使用的时候要注意越界问题。
比如 Hello, world!加上结尾的\0是14个字节,我如果申请动态空间的时候把100改成5,那就会报错:
方法二:使用字符数组进行初始化
char str[15] = "Hello, world!";
char *ptr = str;
先直接定义字符串数组并赋值给str,然后指针指向字符数组
上图:
升级:数组 char *array[]的初始化
跟 char *类似,最容易出错的写法是:
char *array[] = {"Hello", "world", "!"};
这就犯了跟之前一样的错。正确的方法是:
方法一:
对标 char* 的第一个方法:需要使用动态内存分配函数 malloc 分配空间
char *str1 = (char*)malloc(6 * sizeof(char)); // 分配存储空间
strcpy(str1, "Hello"); // 给存储空间赋值
char *str2 = (char*)malloc(6 * sizeof(char));
strcpy(str2, "world");
char *str3 = (char*)malloc(2 * sizeof(char));
strcpy(str3, "!");
char *array[] = {str1, str2, str3};
最后不要忘了,这些字符串的内存空间是不会被释放的,需要在使用完char *array[] 之后要逐个释放动态分配的内存空间,防止内存泄漏,可以用free 也可以用delete,例如:
free(str1);
或者
delete[] str1;
最后,再释放指针数组本身所占用的空间,以避免内存泄漏。
方法二
char str1[] = "Hello";
char str2[] = "world";
char str3[] = "!";
char* array[] = {str1, str2, str3};
这种方法,指针指向的字符串是存储在栈区的字符数组,函数返回后这些数组就会自动释放,不用手动去释放空间。