【问题标题】:Assigning a value to char* in a struct为结构中的 char* 赋值
【发布时间】:2014-12-09 12:19:20
【问题描述】:

我的代码有问题,我无法将字符串值分配给结构中的 char*。谁能告诉我我的代码有什么问题以及为什么?

#include <iostream>
using namespace std;

typedef struct{
char* name;
char* city;
int age;
} person;
void main()
{
person * user;
user = (person*)malloc(sizeof(person*));

cout << "Please fill in the user info.." << endl << "Name: ";
cin >> user->name;
cout << "Age: ";
cin >> user->age;
cout << "City";
cin >> user->city;

cout << "The user info is:" << endl << "Name: " << user->name << endl << "Age: " << user->age << endl << "City: " << user->city << endl;
system("pause");
}

非常感谢。

【问题讨论】:

  • 选择一种语言。如果是 C,不要使用cin,并为字符串分配一些内存。如果是 C++,请使用 std::string,不要使用 malloc 或原始指针。如果它是两者的可怕混合,那么现在就放弃吧。
  • 请澄清“无法分配字符串值”的含义。该代码中只有一个赋值,即user = ...。 (并且不要在 C++ 中使用malloc,使用new。)
  • 尝试更改“user = (person*)malloc(sizeof(person*));” to "user = (person*)malloc(sizeof(person)); "
  • @molbdnilo 不要使用new
  • 抱歉,这段代码有很多问题。当错误层层出现时,很难解释什么是错误的。是的,这很残酷,但有时现实很残酷。 C 和 C++ 与典型的脚本语言有很大不同,并且需要您对内存处理有扎实的掌握。在您了解指针和内存管理之前,请获得一个好的 C 教程,并且永远不要接触 C++。当您准备好使用 C++ 时,您应该了解如何以及为什么将 malloc 替换为 new/delete,然后在您了解了 new/delete 的替代方案之后,您可以在实际项目中使用 c++ .

标签: c++ c pointers struct


【解决方案1】:

您的代码是 C 和 C++ 风格的可怕混合,正如 Mike 的评论所说,选择一种语言并正确使用它。

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

struct person {
  string name;
  string city;
  int age;
};

int main()
{
  person user;

  cout << "Please fill in the user info.." << endl << "Name: ";
  cin >> user.name;
  cout << "Age: ";
  cin >> user.age;
  cout << "City";
  cin >> user.city;

  cout << "The user info is:\n" << "Name: " << user.name << "\nAge: " << user.age << "\nCity: " << user.city << endl;
  system("pause");
}

不要在不需要时动态分配(这样就不会有分配错误内存量的风险,也不会有不为字符串分配内存的风险,这些都是您在原始程序中犯的错误) .

main 必须返回 int 而不是 void

typedef struct {...} x; 在 C++ 中不是必须的,直接说struct x {...};

Don't overuse endl

【讨论】:

    【解决方案2】:

    您已经用两种不同的语言标记了这个问题,并且似乎是在以两种语言的可怕混合进行编码。你应该选择一种语言并坚持下去。

    如果这是 C++,则使用标准库:

    #include <string>
    #include <iostream>
    
    struct person {
        std::string name;
        std::string city;
        int age;
    };
    
    int main() {    // not void
        person user;
        // ...
        std::cin >> user.name;
        // ...
    }
    

    如果它是 C,那么你需要为字符串分配内存。从堆中分配它们:

    person user;
    user.name = malloc(MAX_NAME_SIZE);
    user.city = malloc(MAX_CITY_SIZE);
    

    或将它们嵌入到结构中:

    typedef struct {
        char name[MAX_NAME_SIZE];
        char city[MAX_NAME_SIZE];
        int name;
    } person;
    

    当您从输入中读取数据时,请注意不要溢出这些固定大小的缓冲区。

    如果出于某种原因你真的想为结构本身使用malloc,那么为结构分配足够的空间,而不仅仅是一个指针:

    user = malloc(sizeof(person));
    

    【讨论】:

      【解决方案3】:
      malloc(sizeof(person));
      

      这将为保存 2 个 char* 和 1 个 int 创建内存。

      你还需要为你错过的 struct 中的 char*s 分配内存。

      【讨论】:

      • 您原来的答案是错误的,malloc(sizeof(person*)) 没有为两个指针和一个 int 分配空间。您编辑的答案更准确,但这不是 OP 的代码所做的。
      【解决方案4】:

      我不知道c++,但如果您选择坚持使用c,您的user-&gt;name 不会分配内存,user-&gt;city 也不会。您需要使用具有适当大小的malloc() 为指针变量分配内存,然后使用它们来存储值。

      还有,

      user = (person*)malloc(sizeof(person*));
      

      应该是

      user = malloc(sizeof(*user));
      

      那么,void main()要改成int main(),需要加上return 0。最好将退出状态发送回 shell。


      注意:通过查看

      的用法
      #include <iostream>
      using namespace std;
      

      它看起来更像是 c++ 的东西,但 IMO,逻辑应该是一样的。

      【讨论】:

      • 在大多数正确编写的 C++ 中应该不需要强制转换
      • @JonathanWakely 应该从语言中删除逻辑转换吗?我很确定有正确编写的 C++ 有时需要强制转换。
      • @AliAlamiri,也许你在我的评论中错过了“最”这个词?请不要根据我没有说的话的“逻辑”提出荒谬的主张。或者您可能认为 should 是 OP 的简单程序所必需的,尽管有两个答案显示了如何在 C++ 中干净利落地执行此操作而无需强制转换。
      • @JonathanWakely 您评论的措辞表明正确编写的 C++ 不应使用强制转换。 “大多数”这个词只是更加强调了这一点(对我作为读者而言)。但我知道什么...
      • @ravi,这与这个问题的上下文无关。再说一次,我从来没有说过永远不需要强制转换,我说“在最正确编写的 C++ 中不应该要求强制转换”,为什么人们甚至争论这一点?
      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 2015-12-18
      • 2015-12-20
      相关资源
      最近更新 更多