c ++ 11 memcpy数据从一个int *到另一个int *

时间:2014-04-15 13:51:04

标签: c++ pointers memcpy

我有一个班级:

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。

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

  1. 首先:我总是试图直接保存char*(你在构造函数中看到这个),只有这样才能实现我的字符串指针。
  2. <强>解决方案:

    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数据。
    2. <强>解决方案:

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