问题提出
为什么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[]的内存大小不能被动态改变。同时,指针并不能被赋值到指针。