【问题标题】:strncpy char string issue when deleting the array删除数组时出现strncpy char字符串问题
【发布时间】:2018-11-13 18:04:39
【问题描述】:

我不知道,这个错误有问题。但是,我认为我应该在删除[]cpp 之前删除uName[]。我该怎么做?

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string.h>

using namespace std;
class cppUr
{
public:
    void writeName(char nm[]);
    char * readName();

private:
    char uName[80];
};
void cppUr::writeName(char nm[])
{
    strncpy(uName, nm, 79);
}
char * cppUr::readName()
{
    return uName;
}

主要是:

int main()
{
    char name0[100];
    char name1[100];
    char name2[100];
    char name3[100];
    cppUr *cpp = new cppUr[3];
    cout << "Input first name: "<<endl;
    cin.getline(name0, 100);
    cpp[0].writeName(name0);
    cout << "Input second name: " << endl;
    cin.getline(name1, 100);
    cpp[1].writeName(name1);
    cout << "Input third name: " << endl;
    cin.getline(name2, 100);
    cpp[2].writeName(name2);
    cout << "Input fourth name: " << endl;
    cin.getline(name3, 100);
    cpp[3].writeName(name3);
    for (int i = 0; i < 4; i++)
    {
        cpp[i].readName();
        cout << "The "<<i<<" name " << cpp[i].readName() << endl;
    }
    delete[] cpp;
    system("PAUSE");
    return 0;
}

错误是:

检测到堆损坏:在 0x0059E1E0 的正常块 (#148) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存

【问题讨论】:

  • 你分配了 3 个cppUr,然后使用了 4 个。
  • 你应该永远删除uName。它是静态分配的,而不是动态分配的。也没有理由动态分配cpp,如果你正在学习C++,你应该使用std::string而不是所有char[]char*strncpy和手动动态内存管理。
  • 如果使用 std::string 而不是 C 风格的字符串会更简单。
  • 请注意,对于“安全”的任何合理定义,strncpy不是“安全”替代 strcpy。仔细阅读其documentation

标签: c++ arrays object strncpy


【解决方案1】:

错误很简单。

您使用 3 个元素从 ccpUr 创建数组,但在使用了 4 个元素之后。

当然 c++ 是基于 null 的索引语言,但这意味着最后一个是不可用的。这就是为什么在你的 for 循环条件中必须在数组分配中使用相同的数字,即 3

想一想,当 [3] 足够 4 个元素时,[2] 足够 3 个元素然后 [1] 足够 2 个元素,而 [0] 足够 1 个元素?你感觉到了吗?零大小的数组是不够的。

问候

【讨论】:

  • 但是数组是从0开始的?当我创建数组 [3] 时,它应该包括 [0]、[1]、[2]、[3] 和总共 4 个?
  • 不,这不是真的。如果你有权利,数组[0] 仍然包含一个元素。当您定义数组 [3] 时,不得使用 index3。在 for 条件下你必须使用 i
  • 谢谢,逻辑我明白了
猜你喜欢
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-02
  • 2021-02-19
  • 2022-01-08
  • 2019-05-18
  • 1970-01-01
相关资源
最近更新 更多