C++中char[]的赋值问题(为什么初始化后不能整组赋值)

问题提出

为什么char[]初始化后不能整组赋值?

代码分析

int main(int argc, char const *argv[])
{
    char arr2[] = "ab";
    char arr[] = {'a','b'};
    arr2 = "cd";
    arr = {'c','d'};
    arr[0] = 'c';
    arr[1] = 'd';
    return 0;
}

群友咨询

  • 上面那里定义了 arr 的内容是 a 和 b,如果你再去对 arr 赋值,你原本那块内存区域已经分配了 a 和 b,但是实际操作中不能保证赋值的内容长度相等
  • 就好比你 arr = "abc",比原来的 a 和 b 多出一个字节,它这个变量在内存中分配的大小已经确定了,你不能再给它超出长度

GPT解惑

这是因为在 C++ 中,字符数组的大小是在声明时就已经确定的,并且不能随意更改。例如,在以下代码中:

char arr[2] = {'a', 'b'};

我们声明了一个包含两个元素的字符数组 arr,其大小被确定为 2。这表示 arr 可以存储两个字符,但不能存储更多或更少的字符。

如果你尝试将另一个字符数组或字符串常量直接赋值给 arr,则会导致编译错误,因为这会尝试更改字符数组的大小。例如:

char arr[] = {'a', 'b'};
arr = "cd"; // 错误:不能将字符串常量直接赋值给字符数组
arr = {'c','d'}; // 错误:不能将字符数组直接赋值给另一个字符数组

为了复制字符数组或字符串常量的值,你需要使用函数(例如 strcpy、strncpy 或 memcpy)来将数据从一个数组复制到另一个数组。这些函数会复制特定数量的字节或字符,而不会尝试更改数组的大小。

但是我{'c','d'}和arr原本的{'a', 'b'}的内存大小应该是一样的,为什么还是不可以赋值?

是的,你是对的,{'a', 'b'}{'c', 'd'} 的大小都是相同的,都包含两个字符。但问题在于,在 C++ 中,数组名(如 arr)实际上是指向数组第一个元素的指针。这意味着,当你尝试将一个字符数组分配给另一个字符数组时,实际上是尝试将一个指针赋值给另一个指针。

例如,以下代码:

char arr[] = {'a', 'b'};
char new_arr[] = {'c', 'd'};
arr = new_arr;

会导致编译错误,因为你不能将一个指针赋值给另一个指针。这与数组的大小无关。

要复制一个字符数组的值到另一个字符数组中,你可以使用函数(例如 strcpy、strncpy 或 memcpy)。这些函数不会尝试更改数组本身的大小,而是复制数组中的值。例如:

#include <cstring>
// ...
char arr[] = {'a', 'b'};
char new_arr[] = {'c', 'd'};
std::memcpy(arr, new_arr, sizeof(new_arr));

这将用 new_arr 数组中的值覆盖 arr 中的值,而不会更改 arr 的大小或将其设置为指向 new_arr 的指针。

总结

指针、内存、int[],char[]的内存大小不能被动态改变。同时,指针并不能被赋值到指针。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容