我想在 C 中连接两个字符数组。我在某处找到了这段代码。我知道数组大小一旦初始化就无法调整大小。实现动态字符数组的另一种方法是使用动态内存分配。但在下面的代码中,您可以发现我们有一个名为“first”的字符数组,大小为 8 个字节,包括“”,然后我们将“first”数组传递给 concatenateStrings 函数,现在“dest”数组的大小应该是 8字节。在此函数中,您可以发现大小为 7 字节的“src”数组连接到“dest”数组。 “dest”数组大小应为 8 个字节,我的问题是“dest”数组如何接受更多字符。因为在串联过程结束时,您可以发现 'dest' 数组包含 13 个字符。数组的大小也应该等于数组中的字母数,因为 1 个字符 = 1 个字节。所以当我执行这个程序时,我得到的 sizeof(dest) 是 8,strlen(dest) 是 13
#include <stdio.h>
#include <stdlib.h>
void concatenateStrings(char dest[], const char src[]) {
/* Find the end of the destination string (null terminator) */
int i = 0;
while (dest[i] != '\0') {
i++;
}
/* Copy characters from src to the end of dest */
int j = 0;
while (src[j] != '\0') {
dest[i++] = src[j++];
}
/* Add null terminator to the concatenated string */
dest[i] = '\0';
printf("dest string: %d\n", sizeof(dest));
printf("dest len string: %d\n", strlen(dest));
printf("src string: %d\n", sizeof(src));
}
int main() {
char first[] = "Hello, ";
char second[] = "World!";
printf("First string: %d\n", sizeof(first));
printf("Second string: %d\n", sizeof(second));
concatenateStrings(first, second);
printf("Concatenated string: %s\n", first);
return 0;
}
C 不对数组执行任何类型的边界检查。这就是它变得快速的部分原因。但是,这也意味着如果您读取或写入超过数组末尾,则会调用未定义的行为。
对于未定义的行为,C 标准无法保证您的程序会做什么。它可能会崩溃,可能会输出奇怪的结果,或者可能看起来工作正常。更糟糕的是,未定义的行为会随着对代码看似不相关的更改而改变,例如添加用于调试的
printf
语句或添加未使用的局部变量。
因此您需要将代码更改为不这样做,因为语言期望您做正确的事情。