Как я могу изменить значение строки, определенной в структуре? - PullRequest
0 голосов
/ 21 апреля 2010

Исходя из ваших комментариев, позвольте мне изменить исходный вопрос ...

Я хочу создать структуру размером 4 КБ (этот размер является обязательным, поэтому я должен соответствовать ему). Проблема заключалась в том, что я не мог изменить значение строковой переменной, содержащейся в структуре, потому что компилятор выдает ошибку сегментации. В настоящее время, если я использую указатель на строку вместо строковой переменной, я теперь знаю, как это сделать (спасибо вам, ребята), однако я прочитал, что способ, которым я использую для выделения 4 КБ памяти (malloc) не самый лучший или подходящий. Если я использую ключевое слово «new», оно динамически распределяет достаточно памяти для структуры и, вероятно, использует другое значение, чем 4 КБ, верно? а это то, чего я не хочу.

У меня все еще есть сомнения относительно того, почему я не мог изменить значение строковой переменной (не указателя), содержащейся в моей структуре (что-то вроде paginas -> dato = "test"). Вероятно, это должно быть следствием использования malloc

Во всяком случае, я был бы очень признателен за советы о том, как выделить 4 КБ памяти.

Исходный код на 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 ]

5 голосов
/ 21 апреля 2010

dato - это указатель на строку. То есть он говорит вам, где искать строку, но на самом деле он не содержит строку.

Поэтому, если вы хотите назначить ей строку, вы должны выделить память для хранения строки самостоятельно и передать указатель на эту память для структуры, которая будет для вас сохранена.

pagina->dato = new string("test");

Когда вы закончите со структурой, вам нужно помнить, чтобы освободить память для строки, или вы получите «утечку памяти» (потому что, опять же, структура не отвечает за память, содержащую строку, только для запоминания, куда вы его положили):

delete pagina->dato;
pagina->data = NULL;
1 голос
/ 21 апреля 2010
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> вместо необработанного массива указателей.

0 голосов
/ 21 апреля 2010
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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...