Char 数组如何接受超过其初始化大小的字母

问题描述 投票:0回答:1

我想在 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;
        }
arrays c char
1个回答
0
投票

C 不对数组执行任何类型的边界检查。这就是它变得快速的部分原因。但是,这也意味着如果您读取或写入超过数组末尾,则会调用未定义的行为

对于未定义的行为,C 标准无法保证您的程序会做什么。它可能会崩溃,可能会输出奇怪的结果,或者可能看起来工作正常。更糟糕的是,未定义的行为会随着对代码看似不相关的更改而改变,例如添加用于调试的

printf
语句或添加未使用的局部变量。

因此您需要将代码更改为这样做,因为语言期望您做正确的事情。

© www.soinside.com 2019 - 2024. All rights reserved.