为啥在 c++ 中分配 char 数组元素时,分配的字符被破坏?

Posted

技术标签:

【中文标题】为啥在 c++ 中分配 char 数组元素时,分配的字符被破坏?【英文标题】:Why in assigning a char array elements in c++, the assigned character is destroyed?为什么在 c++ 中分配 char 数组元素时,分配的字符被破坏? 【发布时间】:2019-12-13 16:37:58 【问题描述】:

我用 C++ 编写了一个函数,它从 char 数组中删除两个字符。我认为当我将str[o+2] 分配给str[o] 时,不应更改str[o+2]。但是当我使用 cout 打印它时,我看到 str[o+2] 被更改为 null。

#include<iostream>
#include<string.h>
using namespace std;
void shiftLeft(char*,int, int);
int main()
    char str[100];
    cout<<"enter the string: ";
    cin>>str;
    cout<<"removes the letter with index i and i+1\nenter i:";
    int i;
    cin>>i;
    int n=strlen(str);
    shiftLeft(str,i,n);
    cout<<str;
    return 0;

void shiftLeft(char*str,int i, int n)
    for(int o=i-1; o<n; o++)
        str[o]=str[o+2];
    


例如输入 "abcdef"i=3,我希望输出 "abefef" 但我得到 "abef"。最后一个"ef" 在哪里?为什么会被忽略?

【问题讨论】:

如果字符串末尾有一个空字符,你要确保它不会被复制。 先自己调试试试,这确实是一个很简单的问题。一张纸和一支铅笔在这里最有帮助。还请再次阅读初学者 C 教科书中处理字符串的章节。 这也是未定义的行为。在条件o &lt; n 下,变量o 最多获得n-1,访问str[o+2] 然后等于str[n+1],这是超出范围的。 【参考方案1】:
abcdef0???... <- the contents of array (0 means NUL, ? means indeterminate)
  ef0?        <- what is written to the position (shifted 2 characters)

str[o+2] 分配给str[o] 本身不会改变str[o+2], 但后来 o 将来到 o+2,这要归功于 for 语句,然后将 str[o+2] 分配给 str[o] 意味着将 str[o+4] 分配给具有原始 o 值的 str[o+2]

然后,写入终止空字符并结束字符串。

【讨论】:

以上是关于为啥在 c++ 中分配 char 数组元素时,分配的字符被破坏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要用Hash

如何在 C++ 中分配一个二维指针数组

在函数 C++ 中分配内存二维数组

是否可以在linux中分配大量虚拟内存?

为啥在单个语句中分配动态对象的成员变量会导致 PHP 中的语法错误?

为啥编译器在堆栈中分配的比需要的多?