C++学习笔记002——char * 以及char * array[]类型变量的初始化(菜鸟篇)

227 阅读3分钟

前情提要

最近在写代码的时候,时不时会遇到类似const char* 类型的值,不能用于初始化char* 类型的实体”这样的错,可能在基础牢靠的大佬来说很简单,但是对于我这个没有系统学过C的菜鸟来说,还是有些烦的,所以这里就来小结一下。

正文 char*

首先,我先找了一些资料,找了一下char* 类型的变量可以有哪些方式可以初始化,然后就找到了以下方法:

易错写法:直接赋值(不可以)

这个是最容易出错的一种方式,这里还是给点出来一下。

char *str = "Hello, world!";

我把这段代码放到程序里,还没运行,代码底下就有个红红的波浪线,这是编辑器在告诉我有错,鼠标放上去,就看到了开头我提到的那个错误

1681287247727.jpg

后来我查了一下,报这个错是因为字符串字面值是常量,而 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,那就会报错:

image.png

方法二:使用字符数组进行初始化

char str[15] = "Hello, world!";
char *ptr = str; 

先直接定义字符串数组并赋值给str,然后指针指向字符数组

上图:

image.png

升级:数组 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};

这种方法,指针指向的字符串是存储在栈区的字符数组,函数返回后这些数组就会自动释放,不用手动去释放空间。