【问题标题】:Dynamically allocated string动态分配的字符串
【发布时间】:2014-04-20 22:35:10
【问题描述】:

我已经定义了一个存储字符串长度和内容的结构体。

struct sir {
    int length;
    char* string;
};

我正在尝试使用以下方法为该字符串动态分配内存空间:

s->string = malloc(sizeof(char) * (s->length));

但我不断收到此错误:

error C2440: '=' : cannot convert from 'void *' to 'char *' 

你能指导完成这个功能吗?

PS:我真的很想知道如何在这个新创建的字符串中从键盘写入值? 提前Tnx!

【问题讨论】:

  • 将其替换为std::string。无需手动内存管理。如果必须自己做,请使用new,而不是malloc
  • cc++?为什么在c++ 中使用malloc
  • 另外请看这篇文章:do i cast the result of malloc?
  • 我自己设法从键盘上写了值。所以别在意最后一个问题。谢谢大家的帮助!

标签: c++ string pointers malloc


【解决方案1】:

malloc() 将返回void *,这需要在C++ 中显式转换为char *(尽管C 中不需要)。

试试

s->string = (char *) malloc(sizeof(char) * (s->length));

编辑:当您使用C++ 时,正如@chris 评论的那样,您应该考虑改用std::string。不需要手动内存管理。如果必须自己做,请使用new 而不是malloc

【讨论】:

  • 是的。现在可以了。最后一个想法:如何在这个字符串中写入值?
  • 我认为,您应该解释一下为什么s->string = malloc(sizeof(char) * (s->length)); 实际上出现在这么多代码中,以及为什么它不能为 OP 编译。
  • @cmaster 添加。谢谢。
  • @user3423372 你可以使用strcpy()
【解决方案2】:

您正在将程序编译为 C++ 程序。函数 malloc 的返回类型是 void * 但是指向 void 的指针在 C++ 中可能不会隐式转换为指向其他类型的指针,并且错误消息说明了这一点。

所以写

s->string = ( char * )malloc(sizeof(char) * (s->length));. 

然而最直接的方式是在 C++ 中使用 operator new 而不是 malloc

s->string = new char[s->length];. 

同样,如果它是一个 C++ 程序,那么最好使用具有明确定义的构造函数、析构函数和复制 bassignment 运算符的类来代替结构。

如果您确实想处理 C 程序,或者将您的程序编译为 C 程序。

【讨论】:

  • 来自莫斯科的@Vlad忘记了“新”?
  • 我知道。但我明白了:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多