【问题标题】:c++11 memcpy data from one int* to another int*c++11 memcpy 数据从一个 int* 到另一个 int*
【发布时间】:2026-02-14 03:35:01
【问题描述】:

我有一堂课:

class Kunde{
    char *name;
    char *ort;
    int *alter;
    double umsatz;
    int transaktion;
    int id=0;
    int dummyAlter=20;

    public:
    static int anzahl;

    Kunde(char* n=(char*)"Max Maier", char* o=(char*)"Köln", int *a=&dummyAlter);
    Kunde(const Kunde &k);
    ~Kunde();
    void buy(double u);
    static int getAnzahl();
};

在我的 .cpp 文件中,我有:

 Kunde::Kunde(char* n, char* o, int *a)
    {
    name=n;
    ort=o;
    alter=a;
    id=anzahl++;
    umsatz=0;
    transaktion=0;
};

我想写一个复制构造函数。

这是通过以下方式实现的:

 Kunde::Kunde(const Kunde &k)
 {
    int lenname=(int)strlen(k.name)+1;
    name=new char[lenname];
    memcpy(name, k.name, lenname);
    int lenort=(int)strlen(k.ort)+1;
    ort=new char[lenort];
    memcpy(ort, k.ort, lenort);

    alter=new int;
    memcpy(alter, k.alter, sizeof(int));

    id=k.id;
    anzahl++;
    umsatz=k.umsatz;
    transaktion=k.transaktion;
}

代码编译得很好,但是当我执行它时,它会产生一个错误,我使用 memcpy 将数据从 k.alter 复制到 alter。

你看出哪里不对了吗?我尝试了 stfw 和 rtfm,但似乎我太愚蠢了,找不到任何关于“纯”int* 而不是 int*-Arrays 的内容。

感谢您的宝贵时间。

【问题讨论】:

  • 知道 C 风格的字符串比strlen 报告的字符多一个吗?字符串终止符'\0'。但我最大的问题是你为什么不使用std::string?那你就不用担心了!
  • memcpy(alter, &k.alter, sizeof(int)); 中的 & 似乎不正确,如果您想复制 k.alter 指向的内容。无论如何,要复制一个int,普通的分配就可以了,你不需要memcpy
  • 顺便说一句,既然你只分配一个整数,为什么首先要使用指针呢?如果您想要多个整数,请使用std::vector。 C++ standard library 包含很多东西,可以让你作为 C++ 程序员的生活变得更加简单和轻松。
  • 哦,你绝对应该阅读一下the rule of three
  • alter(即年龄)应声明为int,而不是int*。将其存储在其他位置是没有意义的。而且您绝对应该使用 std::string 来存储所有这些字符串,而不是手动将它们管理为 char 数组。

标签: c++ pointers memcpy


【解决方案1】:

关于整数指针的问题,你的问题是双重的:首先,构造函数中有默认参数,它是指向 address 20 的指针,而不是指向 价值20。第二个问题是您在memcpy 调用中使用了address-of 运算符,它会给您指针的地址,即您有一个int ** 类型的表达式。

【讨论】:

  • 好的,感谢您的意见。我修复了这些,但它仍然无法正常工作:(
【解决方案2】:

经过大家的一些提示,我终于找到了问题。

  1. 首先:我总是尝试直接保存char*s(你在构造函数中看到了这一点),结果我只有指向我的字符串的指针。

解决方案:

Kunde::Kunde(char* n, char* o, int a)  
{
    int lenname=(int)strlen(n)+1;
    name=new char[lenname];
    memcpy(name, n, lenname);

    int lenort=(int)strlen(o)+1;
    ort=new char[lenort];
    memcpy(ort, o, lenort);

    alter=new int;
    *alter=a;
    id=anzahl++;
    umsatz=0;
    transaktion=0;
}
  1. 第二:我尝试使用int* 作为构造函数的参数,a) 没有意义,b) 是皇家 PITA。修复参数后,我使用@Matthias247 提出的构造来复制 int-data。

解决方案:

Kunde::Kunde(const Kunde &k) 
{
    int lenname=(int)strlen(k.name)+1;
    name=new char[lenname];
    memcpy(name, k.name, lenname);

    int lenort=(int)strlen(k.ort)+1;
    ort=new char[lenort];
    memcpy(ort, k.ort, lenort);

    alter=new int;
    *alter = *(k.alter);
    id=k.id;
    anzahl++;
    umsatz=k.umsatz;
    transaktion=k.transaktion;
}

【讨论】: