C/CPP/C++ 中的字符数组大小是动态的吗?

Aru*_*was 0 c++ arrays string dynamic-programming

到目前为止,我的知识是 C 和 CPP/C++ 中的数组具有固定大小。然而最近我遇到了两段代码,这似乎与这个事实相矛盾。我在这里附上照片。想听听每个人对这些如何运作的想法。这里也贴一下代码和疑惑:

1.

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    char str1[]="Good"; //size of str1 should be 5
    char str2[]="Afternoon";  //size of str2 should be 10
    
    cout<<"\nSize of str1 before the copy: "<<sizeof(str1);
    cout<<"\nstr1: "<<str1;
    
    strcpy(str1,str2);     //copying str1 into str2      
    
    cout<<"\nSize of str1 after the copy: "<<sizeof(str1);
    cout<<"\nstr1: "<<str1;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

your text O/P: 复制前 str1 的大小:5 str1:良好 复制后 str1 的大小:5 str1:下午

在第一个片段中,我使用 strcpy 将“Afternoon”的 char str2[] 内容复制到 char str1[] 中,其大小比 str2 的大小小 5。因此理论上,strcpy(str1,str2) 行应该给出错误,因为 str1 的大小小于 str2 的大小并已修复。但它执行了,更令人惊讶的是,即使在 str1 包含单词“afternoon”之后,大小仍然相同。

2.

#include <iostream>
#include <cstring>

using namespace std;
int main()  
{  
    char first_string[10]; // declaration of char array variable  
    char second_string[20]; // declaration of char array variable  
    int i;  // integer variable declaration  
    
    cout<<"Enter the first string: ";  
    cin>>first_string;  
    cout<<"\nEnter the second string: ";  
    cin>>second_string;  
    
    for(i=0;first_string[i]!='\0';i++);   
      
      
    for(int j=0;second_string[j]!='\0';j++)  
    {  
        
        first_string[i]=second_string[j];  
        i++;  
    }  
    first_string[i]='\0';  
   cout<<"After concatenation, the string would look like: "<<first_string;  
return 0;  
}
Run Code Online (Sandbox Code Playgroud)

O/P:输入第一个字符串:good

输入第二个字符串:下午

连接后,字符串将如下所示:goodafternoon

在这里,即使我提供长度为 20 的字符串作为 Second_string[] 的输入,它仍然能够连接两个字符串并将它们放入 first_string[] 中,即使连接字符串的大小将明显大于 first_string[ 的大小] 即 10。

我尝试将较大长度的字符串分配给较小长度的字符串变量。从技术上讲它不应该起作用,但无论如何它起作用了

joh*_*ohn 7

这里有两个误区

  1. sizeof是编译时数组的大小。它与数组的内容无关。您可以随意更改内容,但内容sizeof仍然相同。如果您想要字符串的长度,请使用该函数strlen

  2. 大多数时候,当你违反 C++ 规则时,它会导致未定义的行为。将字符串复制到太小而无法容纳该字符串的数组中是未定义行为的一个示例。

你说

因此理论上,strcpy(str1,str2) 行应该给出错误,因为 str1 的大小小于 str2 的大小并已修复。

这是不真实的。未定义的行为并不意味着一定存在错误。它的意思正是它所说的,你的程序的行为是未定义的,任何事情都可能发生。这可能意味着错误消息,或者可能意味着崩溃,或者可能意味着您的程序似乎可以工作。该行为是未定义的。

你并不是唯一一个有这样想法的人。我认为未定义行为的目的sizeof和本质是初学者最常见的两个误解。

并回答标题中的问题。字符数组的大小在 C++ 中是固定的,您的示例中没有任何内容与此相矛盾。