所以我有一个名为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;
}
答案 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;
}