如何修改结构中定义的字符串的值?

时间:2010-04-21 17:00:13

标签: c++ string struct

根据您的意见,让我修改原始问题......

我想创建一个大小为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;  
}

提前致谢!!!

3 个答案:

答案 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));
}