You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类中char*成员变量赋值后为空的问题求助

解决C++类中char*成员复制后为空的问题

嘿,刚接触C++类就碰到这种指针坑太正常了,我来帮你拆解问题~

你遇到的核心问题是:char*类型的成员变量没有提前分配足够的内存空间,直接用strcpy()复制字符串时,因为目标指针指向的是无效内存(要么是未初始化的野指针,要么是你显式设为nullptr的空指针),导致复制操作根本无法完成,最终打印时自然是空白。

先模拟你可能的错误代码

假设你的RentalCar.h是这样的:

#ifndef RENTALCAR_H
#define RENTALCAR_H

class RentalCar {
private:
    char* m_make;
    char* m_model;
public:
    RentalCar(const char* make, const char* model);
    ~RentalCar();
    void printInfo() const;
};

#endif

而RentalCar.cpp的错误实现大概是:

#include "RentalCar.h"
#include <cstring>
#include <iostream>

RentalCar::RentalCar(const char* make, const char* model) {
    // 错误:m_make和m_model是空指针,没有分配内存就直接复制
    strcpy(m_make, make);
    strcpy(m_model, model);
}

RentalCar::~RentalCar() {
    delete[] m_make;
    delete[] m_model;
}

void RentalCar::printInfo() const {
    std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl;
}

这种写法里,m_make和m_model默认是未初始化的(如果没显式初始化就是野指针,显式设为nullptr就是空指针),strcpy()需要目标指针指向一块能容纳整个源字符串(包括末尾的\0结束符)的有效内存,空指针显然不满足这个条件,所以复制完全没生效。


正确的解决方法

方法1:手动分配内存后用strcpy()

先为m_make和m_model分配足够的内存,再执行复制:

#include "RentalCar.h"
#include <cstring>
#include <iostream>

RentalCar::RentalCar(const char* make, const char* model) {
    // 处理make参数:先判断是否为空,避免strlen出错
    if (make != nullptr) {
        // 分配内存:字符串长度 + 1(存结束符\0)
        m_make = new char[strlen(make) + 1];
        strcpy(m_make, make);
    } else {
        // 空输入时分配一个字节存空字符串
        m_make = new char[1];
        m_make[0] = '\0';
    }

    // 同理处理model参数
    if (model != nullptr) {
        m_model = new char[strlen(model) + 1];
        strcpy(m_model, model);
    } else {
        m_model = new char[1];
        m_model[0] = '\0';
    }
}

RentalCar::~RentalCar() {
    // 记得释放手动分配的内存,避免内存泄漏
    delete[] m_make;
    delete[] m_model;
}

void RentalCar::printInfo() const {
    std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl;
}

方法2:用strdup()简化操作(注意兼容性)

strdup()是POSIX标准函数(大部分编译器支持),它会自动分配内存并复制字符串:

#include "RentalCar.h"
#include <cstring>
#include <iostream>

RentalCar::RentalCar(const char* make, const char* model) {
    // 三目运算符处理空输入,默认复制空字符串
    m_make = make ? strdup(make) : strdup("");
    m_model = model ? strdup(model) : strdup("");
}

RentalCar::~RentalCar() {
    // strdup分配的内存要用free()释放,不能用delete
    free(m_make);
    free(m_model);
}

void RentalCar::printInfo() const {
    std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl;
}

方法3:推荐新手用std::string代替char*

如果你不是必须用char*,强烈建议用C++标准库的std::string,它会自动管理内存,完全不用操心分配、释放和复制的问题:

修改RentalCar.h:

#ifndef RENTALCAR_H
#define RENTALCAR_H
#include <string>

class RentalCar {
private:
    std::string m_make;
    std::string m_model;
public:
    RentalCar(const std::string& make, const std::string& model);
    void printInfo() const;
};

#endif

修改RentalCar.cpp:

#include "RentalCar.h"
#include <iostream>

// 用初始化列表直接完成赋值,简洁又高效
RentalCar::RentalCar(const std::string& make, const std::string& model) 
    : m_make(make), m_model(model) {
}

void RentalCar::printInfo() const {
    std::cout << "Make: " << m_make << ", Model: " << m_model << std::endl;
}

总结

对于刚接触C++的新手来说,std::string是比char*友好得多的选择,能避开很多内存管理的坑。如果一定要用char*,记住复制字符串前必须确保目标指针指向足够大的有效内存,否则strcpy()这类函数根本无法正常工作。

内容的提问来源于stack exchange,提问作者Ben Nordin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:03:29