根据您的意见,让我修改原始问题......
我想创建一个大小为4kb的结构(这个大小是必需的,所以我必须满足它)。问题是我无法修改结构中包含的字符串变量的值,因为编译器会抛出分段错误。目前,如果我使用指向字符串而不是字符串变量的指针,我现在知道如何做(感谢你们),但是,我读到了我用来分配4kb内存的方式(malloc)不是最好或最合适的。如果我使用“new”关键字,它会为struct动态分配足够的内存,它可能使用的值不同于4kb,对吧?这就是我不想要的。
我仍然怀疑为什么我无法修改我的struct中包含的字符串变量(不是指针)的值(类似于paginas - > dato =“test”)。它可能应该是使用malloc
的结果无论如何,我非常感谢您就如何分配4kb内存提出建议。
c ++中的原始代码如下:
#define TAM 4000
#define NUMPAGS 512
struct pagina
{
bitset<12> direccion;
char operacion;
char permiso;
string *dato; //I prefer to have a string variable
int numero;
};
void crearPagina(pagina* pag[], int pos, int dir)
{
pagina * paginas = (pagina*)malloc(sizeof(char) * TAM);
paginas -> direccion = bitset<12> (dir);
paginas -> operacion = 'n';
paginas -> permiso = 'n';
string **tempDato = &paginas -> dato;
char *temp = " ";
**tempDato = temp;
paginas -> numero = 0;
pag[pos] = paginas;
}
提前致谢!!!
答案 0 :(得分:5)
dato是指向字符串的指针。也就是说,它告诉你在哪里查找字符串,但它实际上并不包含字符串。
因此,如果您希望为其分配一个字符串,则必须自行分配内存以保存字符串,并将指针提供给该内存以便为您保留。
pagina->dato = new string("test");
当你完成结构时,你需要记住释放字符串的内存,否则你会得到“内存泄漏”(因为同样,struct不负责包含字符串的内存,只记住你把它放在哪里):
delete pagina->dato;
pagina->data = NULL;
答案 1 :(得分:1)
struct pagina
{
pagina(int dir)
: direccion(dir)
, operacion('n')
, permiso('n')
, dato(" ")
, numero(0) {}
bitset<12> direccion;
char operacion;
char permiso;
std::string dato;
int numero;
};
void createPagina(pagina* pag[], int pos, int dir) {
pag[pos] = new pagina(dir);
}
这是更多C ++(与C相反)做你想做的事的方式。创建构造函数而不是创建过程,并使用new
而不是malloc
。我还建议使用std::vector<pagina>
而不是原始指针数组。
答案 2 :(得分:0)
struct pagina
{
bitset<12> direccion;
char operacion;
char permiso;
std::string dato;
int numero;
pagina(int dir)
: direccion(dir), operation('n'), permiso('n'), dato(" "), numero()
{
}
};
void crearPagina(std::vector<pagina>& pag, int dir)
{
pag.push_back(pagina(dir));
}