0

我无法弄清楚为什么这个程序不起作用。我Access Violation在尝试将数据类型为字符串的变量推送到另一个使用 malloc 在内存中分配的变量时收到消息。

例如,首先我声明变量..

string pName;
address temp;

之后,我调用Allocate模块..

temp = Allocate(pName, 1, 1, 200);

这是模块..

#include <...>
#include<string>
#define Info(T) (T)->info
#define FirstSon(T) (T)->ps_fs
#define NextBro(T) (T)->ps_nb
#define Parent(T) (T)->ps_pr

using namespace std;
typedef struct infoElmt{
    string pName;
    float number;
    int type;       
    float price;
}compInfo;
typedef compInfo infotype;

typedef struct tElmtTree *address;
typedef struct tElmtTree {
    infotype info;
    address ps_fs, ps_nb, ps_pr;
} node;

typedef address DynTree;

address Allocate (string pName, float number, int type, float price)     //(string pName, float number, int unit, int type, float price
    {

        address P;

        P = (address) malloc (sizeof(node));

        if (P != NULL)
        {
            Info(P).type = type;
            Info(P).number = number;
            Info(P).price = price;

            FirstSon(P)  = NULL;
            NextBro(P) = NULL;
            Parent(P) = NULL;

            printf("OK");
            Info(P).pName = pName;
        }

        return (P);
    }

程序运行时出现错误Info(P).pName = pName;,我知道是因为如果printf("OK");移到下面Info(P).pName = pName;,控制台中不会显示“OK”。

malloc和字符串有问题吗?

编辑

  • #include<..>是另一个包含,如 conio.h 等。
  • 我忘记using namespace std;在代码中输入..
4

3 回答 3

2

你应该使用new而不是malloc. 您的结构似乎包含 a std::string,当您使用 a 分配结构时,它无法正确初始化malloc

在 C++ 中根本不要使用malloc,除非你有一些罕见的场景,你只需要一块未初始化的内存。只需使用让自己习惯new

另一方面,请尽可能避免动态分配。也许您可能想使用:

std::vector<std::string> obj;
于 2013-05-23T03:05:20.397 回答
0

如果您typedef用于定义结构,则需要使用指针

address *p //you should always use lowercase to declare variables.

可以访问结构字段,因为您使用的是需要使用的指针,->而不是.

Info(p)->type=type;
于 2013-05-23T03:04:55.240 回答
0
  1. 使用 C++new运算符 - 不malloc
  2. 为什么要用这些

    #define Info(T) (T)->info
    #define FirstSon(T) (T)->ps_fs
    #define NextBro(T) (T)->ps_nb
    #define Parent(T) (T)->ps_pr
    

    当您可以直接使用成员变量(或者更好地定义getter和setter)时。

  3. 这条线毫无意义

    typedef compInfo infotype;
    
  4. 查找cout- 打印到控制台的 C++ 方式。printf是 C。

当您修复这些问题时,错误将更加明显。

即C 或C++ 程序。

于 2013-05-23T03:10:58.773 回答