[英]How to fill a String inside an array of structures within a structure in C++
因此,我有一個名為fastarray的結構,其中包含指向另一個稱為token_det的結構的指針。 我的問題是嘗試填充結構數組中的char數組失敗,並且過程中出現錯誤消息,提示為“應用程序在位置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;
}
當我試圖了解您想做什么時,除了您使用memset
的部分之外,我沒有任何問題。 使用memset(f_array, 0, sizeof(f_array));
您正在顯式地將f_array設置為指向內存中的0,這一直在為我拋出異常。
因為我從未真正成為malloc的朋友,所以我一直在使用C ++語法,如下所示:
為了分配單個實例,我將使用FASTARRAY *f_array = new fastarray;
。 您可以在此處閱讀有關為什么在C ++中使用new
而不是malloc
原因。
以相同的方式,我一直在使用C ++語法分配動態數組f_array->td = new token_det[MAX_TOKENS];
您可以在此處找到有關該主題的問答,以供參考。
我認為,要在動態數組的結構內填充數據字符串,我一直在使用+=
語法,因為它更易於閱讀。 使用(*(f_array->td + x)).data += "stasimorphy";
訪問f_array
內部的元素f_array
(*(f_array->td + x)).data += "stasimorphy";
您可以在此處在線嘗試我的解決方案。
我嘗試了盡可能少的更改以使其正常運行。
#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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.