如何在C ++中的结构内填充结构数组中的String

时间:2018-01-21 05:55:27

标签: c++ arrays struct malloc

所以我有一个名为fastarray的结构,它包含一个名为token_det的另一个结构的poiner。我的问题是尝试填充结构数组中的char数组在中途失败并给出错误消息"异常未知软件异常(0x0000417)在位置0x78b2ae6e"的应用程序中发生。我尝试使用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;
}

1 个答案:

答案 0 :(得分:1)

解释我在做什么以及为什么

当我试图了解您想要做什么时,除了您使用memset的部分外,我没有任何问题。使用memset(f_array, 0, sizeof(f_array));,你明确地将f_array设置为在内存中指向0,这会不断地为我抛出异常。

由于我从未真正成为malloc的朋友,所以我一直在使用C ++语法,如下所示:

为了分配单个实例,我使用FASTARRAY *f_array = new fastarray;。您可以了解为什么在C ++ here中使用new代替malloc是有利的。

以同样的方式,我一直在使用C ++语法来分配动态数组f_array->td = new token_det[MAX_TOKENS];有关该主题的Q&amp; A可以找到here

为了填充动态数组结构中的数据字符串,我一直在使用+=语法,因为在我看来,它更容易阅读。使用f_array

可以访问(*(f_array->td + x)).data += "stasimorphy";中的元素

您可以在线试用我的解决方案here

代码转储

我尝试尽可能少地改变它以使其发挥作用。

#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;
}