【问题标题】:Copy string to struct through pointer通过指针将字符串复制到结构
【发布时间】:2016-02-29 10:58:23
【问题描述】:

以下代码有一些非常奇怪的行为:

When chosen = 0, it returns -1073741819.

When chosen = 1, it runs but the output strings are messed up.

#include <iostream>
#include <cstring>
using namespace std;

char* name[2] = {"WithoutSpaces","With spaces"};
struct entity{
    char* name;
};
struct entity *foo1, *foo2;

int main(void){
    foo1 = new entity;
    foo2 = new entity;
    int chosen = 1;

    foo1->name = new char[sizeof(name[chosen])+1];
    strcpy(foo1->name,name[chosen]);

    foo2->name = new char[sizeof(name[chosen])+1];
    strcpy(foo2->name,name[chosen]);

    cout << foo1->name <<endl;
    cout << foo2->name <<endl;
    return 0;
}

发生了什么?

【问题讨论】:

  • name[chosen] 是一个指针。 sizeof 指针不是你需要的。您需要找出字符串的长度。但说真的,请改用std::string
  • 不要在 C++ 中使用 char* anc C 数组
  • 您忘记释放所有动态分配的内存。
  • @juanchopanza 所说的关于std::string 的内容延伸到像std::unique_ptr 这样的智能指针。我看到四个 news 没有 deletes。

标签: c++ string struct


【解决方案1】:

你应该使用

foo1->name = new char [strlen(name[chosen]) + 1];
strcpy(foo1->name, name[chosen]);

而不是

foo1->name = new char[sizeof(name[chosen])+1];
strcpy(foo1->name,name[chosen]);

因为 sizeof(name[chosen]) 返回指针“name[chosen]”的大小。而且你需要字符串的长度,你可以用strlen函数得到这个长度。

【讨论】:

    【解决方案2】:

    sizeof 只会返回指针的大小

    您可以使用strlenstrlen

    【讨论】:

      【解决方案3】:

      name[chosen] 的类型始终为char *sizeof(char*) 可能是 4 或 8(取决于平台)。因为您的分配太小, strcpy() 将覆盖未分配的内存,导致未定义的行为。

      【讨论】:

      • 你的意思是 sizeof(char*) 吗?
      • @H.Guijt:现在可以(现在 Mat 已经修复了标记),但之前,您的 * 字符被视为“斜体”标记。
      • 哦,抱歉,我没看到。我还没有真正掌握标记的窍门。某处是否有可用标记代码的描述?
      猜你喜欢
      • 2017-09-12
      • 1970-01-01
      • 2015-01-17
      • 2010-09-27
      • 2011-11-01
      • 1970-01-01
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多