删除数组时strncpy char字符串问题

时间:2018-11-13 18:04:39

标签: c++ arrays object strncpy

我不知道,此错误有问题。但是,我认为应该先删除uName[],然后再删除[]cpp。我该怎么办?

#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;
}

错误是:

  

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

1 个答案:

答案 0 :(得分:0)

错误非常简单。

您可以使用 3 个元素从ccpUr创建数组,但是在使用其中的 4 个元素之后。

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

考虑一下,当[3]足以容纳4个元素时,[2]足以容纳3个元素,然后[1]足以容纳2个元素,而[0]足以容纳1个元素?你感觉到了吗?零大小的数组不足以容纳所有内容。

致谢