快速新的运营商问题

时间:2011-11-18 17:28:24

标签: c++

我知道这很容易,而且我正在寻找一些东西,但这就是我所拥有的......:

typedef struct
{
    char s1[81];
    char s2[81];
    char s3[81];
}Rec;

int main()
{   

   Rec *a[10];

   a[0] = (Rec*)new unsigned char(sizeof(Rec));
   a[0]->s1= "hello";
   printf("a[0] = %s\n",a[0]->s1);
   delete(a[0]);


   getchar();
   return 0;
}

现在,行

  

a [0] - > s1 =“hello”;

抱怨表达式必须是可修改的左值。我很确定这是我如何在我的新操作员系列中投射它并且它需要是一个很长的值或者其他东西但是我不确定要做到这一点的代码......我很容易知道但是是的。任何帮助将不胜感激

5 个答案:

答案 0 :(得分:5)

您不能像这样分配给char数组。使用strcpy,或将char数组更改为std::string

strcpy(a[0]->s1, "hello");

你为什么这样做:

a[0] = (Rec*)new unsigned char(sizeof(Rec));

而不是:

a[0] = new Rec;

答案 1 :(得分:3)

两件事。这条线

a[0] = (Rec*)new unsigned char(sizeof(Rec));

分配一个初始化为值unsigned char的{​​{1}}。你可能意味着

sizeof(Rec)

或更好

a[0] = (Rec*)new unsigned char[sizeof(Rec)];

其次,你不能将字符串文字分配给字符数组,你需要逐个复制字符,例如

a[0] = new Rec;

但在这种情况下,您应该使用char s[80]; s = "hello"; // won't work strcpy(s, "hello"); // correct

答案 2 :(得分:1)

我猜你生命中已经做了很多C。请记住,C ++是不同的语言,它恰好与C语言及其某些标准库共享。这意味着在C语言中完全没问题的东西可能在C ++中非常难看(甚至是危险的)。

话虽如此,让我们用更“C ++ - ish”的方式重写你的代码:

#include <iostream> // std::cout, std::endl
#include <string> // std::string

struct Rec // typedef is implicit for structs in C++
{
    std::string s1; // use std::string instead of char arrays
    std::string s2;
    std::string s3;
}; // don't forget the semicolon!

int main()
{   

   Rec * a[10];

   a[0] = new Rec; // allocates the right amount of memory, no need to cast
   a[0]->s1 = "hello"; // std::sring handles the assignment for you
   std::cout << "a[0] = " << a[0]->s1 << std::endl; // use iostreams
   delete a[0]; // delete is an operator, not a function, no need for parentheses

   getchar(); // warning, this is not portable
   return 0;
}

如您所见,new不是“改进的malloc”。它是类型安全的(不需要强制转换),使用起来更安全(它分配了所需的确切内存量,不需要sizeof),它还可以执行malloc 无法 do:它调用类的构造函数(就像delete调用析构函数一样)。

在C ++中,与C一样,分配初始化不同。在C语言中你可以只将memset块归零,在C ++对象构造中可能会有点复杂。因此,您应该从不使用malloc来创建具有非平凡构造函数的类的对象(或者具有不具有非平凡构造函数的字段 - Rec是这样的一件事)。由于new始终有效,并且具有其他功能,因此无论如何都应该使用它。

答案 3 :(得分:0)

问题不在于您的演员表。您的新表达式会分配一个unsigned char并将其初始化为sizeof(Rec),而不是像new unsigned char[sizeof(Rec)];那样分配足够的空间。也就是说,s1"hello"的类型不同,您不能将其中一个分配给另一个。您应该使用类似strcpy的内容,但由于您标记了此 C ++ ,因此最好使用std::string。另外,你为什么不打电话给new Rec;

答案 4 :(得分:0)

a [0]是指向无法修改的字符数组的指针 - [0]将始终指向同一地址。 你需要使用strcpy从你的“hello”字符串复制到[0]