C++ 如何在C+中的结构中的结构数组中填充字符串+;

C++ 如何在C+中的结构中的结构数组中填充字符串+;,c++,arrays,struct,malloc,C++,Arrays,Struct,Malloc,因此,我有一个名为fastarray的结构,其中包含一个指向另一个名为token_det的结构的poiner。我的问题是,尝试在结构数组中填充字符数组中途失败,并给出一条错误消息,即“在位置0x78b2ae6e的应用程序中发生了异常未知软件异常(0x0000417)”。我尝试使用malloc增加char数组的大小,但是字符串concat函数在浓缩了几个字符串后仍然失败。下面是代码示例: #include <stdio.h> #include <string> #inclu

因此,我有一个名为fastarray的结构,其中包含一个指向另一个名为token_det的结构的poiner。我的问题是,尝试在结构数组中填充字符数组中途失败,并给出一条错误消息,即“在位置0x78b2ae6e的应用程序中发生了异常未知软件异常(0x0000417)”。我尝试使用malloc增加char数组的大小,但是字符串concat函数在浓缩了几个字符串后仍然失败。下面是代码示例:

#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream.h>

using namespace std;

#define MAX_TOKENS 300000

struct token_det
{
    int token;

    std::string data;
    char mdepth[300];

};

typedef struct fastarray
{
    token_det *td;  //MAX_TOKENS
}FASTARRAY;


int main()
{
    printf("inside main\n");

    int lv_ret = 0;
    int count = 0;
    char log[50] = {""};
    int wtoken = 0;

    FASTARRAY *f_array = NULL;

    f_array = (FASTARRAY *)malloc(sizeof(FASTARRAY));
    f_array->td = NULL;
    f_array->td = (token_det *)malloc(MAX_TOKENS * sizeof(token_det));

    printf("after malloc\n");

    memset(f_array, 0, sizeof(f_array));
    memset(f_array->td, 0, sizeof(f_array->td));

    int x=0;
    while(x<=10000)
    {
        printf("inside while");
        f_array->td[x].data = "104,";

        f_array->td[x].data.append("stasimorphy");  
        f_array->td[x].data.append(",");

        f_array->td[x].data.append("psychognosy");
        f_array->td[x].data.append(",");

        f_array->td[x].data.append("whoever");
        f_array->td[x].data.append(",");

        x++;

        sprintf_s(log,sizeof(log),"Data for x-%d = %s\n",x,f_array->td[x].data);
        printf(log);
    }

    free(f_array->td);
    free(f_array);

    printf("after while\n");
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
#定义最大令牌数300000
结构令牌\u det
{
int标记;
std::字符串数据;
字符深度[300];
};
类型定义结构fastarray
{
令牌\u det*td;//最大令牌数
}快速阵列;
int main()
{
printf(“内部主\n”);
int lv_ret=0;
整数计数=0;
字符日志[50]={“};
int-wtoken=0;
FASTARRAY*f_数组=NULL;
f_数组=(FASTARRAY*)malloc(sizeof(FASTARRAY));
f_数组->td=NULL;
f_数组->td=(token_det*)malloc(MAX_TOKENS*sizeof(token_det));
printf(“在malloc之后\n”);
memset(f_数组,0,sizeof(f_数组));
memset(f_数组->td,0,sizeof(f_数组->td));
int x=0;
而(xtd[x].data=“104,”;
f_array->td[x].data.append(“statimorphy”);
f_数组->td[x].data.append(“,”);
f_数组->td[x].data.append(“心理感应”);
f_数组->td[x].data.append(“,”);
f_array->td[x].data.append(“任何人”);
f_数组->td[x].data.append(“,”);
x++;
sprintf_s(log,sizeof(log),“x的数据-%d=%s\n”,x,f_数组->td[x].数据);
printf(日志);
}
自由(f_阵列->td);
自由(f_阵列);
printf(“在while\n之后”);
返回0;
}
解释我当时在做什么以及原因 当我试图理解你想在那里做什么时,除了你使用
memset
的部分之外,我没有任何问题。使用
memset(f_数组,0,sizeof(f_数组));
你在内存中将f_数组显式设置为指向0,这会不断地为我抛出异常

因为我从来没有真正是MALOC的朋友,我一直使用C++语法如下:

分配单个实例时,我会使用<代码> FasTrace*fyReals=新FaStRay.<代码>。您可以阅读为什么使用<代码>新< /COD>而不是<代码> MalOC/在C++中是有利的。

同样地,我使用C++语法来分配动态数组<代码> fyRoals> > t=新的ToKeNo.DET[Max StokEns];< /Cord>可以找到关于该主题的问答。 为了填充动态数组结构中的数据字符串,我一直在使用

+=
语法,因为我认为它更易于阅读。访问
f_数组中的元素是通过
(*(f_数组->td+x))实现的。data+=“statimorphy”

你可以在线尝试我的解决方案

代码转储 我试着尽可能少的改变来让它工作

#include <sstream>
#include <string>
#include <iostream>

using namespace std;

#define MAX_TOKENS 300000

struct token_det
{
    int token;

    std::string data;
    char mdepth[300];

};

typedef struct fastarray
{
    token_det *td;  //MAX_TOKENS
}FASTARRAY;


int main()
{
    std::cout << "inside main\n";

    int lv_ret = 0;
    int count = 0;
    char log[50] = { "" };
    int wtoken = 0;

    FASTARRAY *f_array = new fastarray;
    f_array->td = new token_det[MAX_TOKENS];

    std::cout << "after malloc\n";

    int x = 0;
    while (x <= 10000)
    {
        std::cout << "inside while";
        std::stringstream log;
        (*(f_array->td + x)).data = "104,";

        (*(f_array->td + x)).data += "stasimorphy";
        (*(f_array->td + x)).data += ",";

        (*(f_array->td + x)).data += "psychognosy";
        (*(f_array->td + x)).data += ",";

        (*(f_array->td + x)).data += "whoever";
        (*(f_array->td + x)).data += ",";

        log << "Data for x-" << x << " = " << (f_array->td + x)->data << std::endl;
        std::cout << log.str();

        x++;
    }

    delete[] f_array->td;
    free(f_array);

    std::cout << "after while\n";
    return 0;
}
#包括
#包括
#包括
使用名称空间std;
#定义最大令牌数300000
结构令牌\u det
{
int标记;
std::字符串数据;
字符深度[300];
};
类型定义结构fastarray
{
令牌\u det*td;//最大令牌数
}快速阵列;
int main()
{
std::cout td=新令牌数据[最大令牌];
std::cout td+x)).data+=“,”;
(*(f_数组->td+x)).data+=“心理感应”;
(*(f_数组->td+x)).data+=“,”;
(*(f_数组->td+x)).data+=“where”;
(*(f_数组->td+x)).data+=“,”;

日志…太长,无法作为一个最小的示例。您尝试过调试代码吗?请提供一个@Ghos3t use
string
@passery我已将代码简化为一个最小的示例,并已切换到使用string而不是char数组。谢谢,您的代码帮助我在自己的解决方案中找到了错误。显然,日志char数组的大小我用来打印的结果对于数据来说太小了,这导致了问题。