首页 > 解决方案 > 在动态内存区域中初始化 char 数组(在构造函数中)时出现问题

问题描述

在动态内存区域中初始化 char 数组(在构造函数中)时出现问题。如何初始化动态分配的内存类型 char*

class Funkcija
{
protected:
    float k;
    float n;
    char* naziv;

#include "Funkcija.h"
#include <iostream>
using namespace std;
Funkcija::Funkcija()
{
    k = 1;
    n = 0;
    naziv = new char;
    naziv = 'Name';
    
}

标签: c++

解决方案


您没有为字符串分配足够的内存"Name"(注意引号)。您只分配 1 char,并且'Name'(引号) 是一个多字节字符,不适合单个char.

您需要更多类似的东西(请参阅3/5/0 规则):

class Funkcija
{
protected:
    float k;
    float n;
    char* naziv;

public:
    Funkcija();
    Funkcija(const Funkcija &);
    ~Funkcija();

    Funkcija& operator=(const Funkcija &);
};
#include "Funkcija.h"
#include <algorithm>
#include <cstring>

Funkcija::Funkcija()
{
    k = 1;
    n = 0;
    naziv = new char[5];
    std::strcpy(naziv, "Name");
}

Funkcija::Funkcija(const Funkcija &src)
{
    k = src.k;
    n = src.n;
    naziv = new char[std::strlen(src.naziv)+1];
    std::strcpy(naziv, src.naziv);
}

Funkcija::~Funkcija()
{
    delete[] naziv;
}

Funkcija& Funkcija::operator=(const Funkcija &rhs)
{
    if (&rhs != this)
    {
        Funkcija temp(rhs);
        std::swap(k, temp.k);
        std::swap(n, temp.n);
        std::swap(naziv, temp.naziv);
    }
    return *this;
}

话虽这么说,你真的应该使用std::string而不是char*,让编译器为你处理所有这些细节,例如:

#include <string>

class Funkcija
{
protected:
    float k;
    float n;
    std::string naziv;

public:
    Funkcija();
};
#include "Funkcija.h"

Funkcija::Funkcija()
{
    k = 1;
    n = 0;
    naziv = "Name";
}

推荐阅读