Проблема получения и хранения адреса памяти в массиве - PullRequest
2 голосов
/ 19 августа 2010

Итак, у меня немного проблем с указателями. Я пишу функцию, которая хранит адреса памяти в []. Эти адреса памяти указывают на фактические значения данных в b []. У меня проблемы с получением адреса памяти от b для сохранения в a.

// Assume these are initialized to 0 outside of this snippet
char a[100];
char b[100];
b[0] = 42;  // Some value for us to use

int* a_ptr = (int*)&a[0];    // Store the address of a[0] in a_ptr
int* b_ptr = (int*)&b[0];    // Store the address of b[0] in b_ptr

*a_ptr = (int)&b_ptr;   // PROBLEM LINE.  The first four bytes of a[] 
                        // should contain the memory address of b[0].
                        // However, it does not.  Here are the debugger values:
                        // a_ptr = 0x00429148
                        // b_ptr = 0x00429151
                        // a[0] SHOULD be 0x00429151, but it is instead 0x0012fe4c.

Есть ли какой-то трюк, который мне нужно сделать, чтобы 0x00429151 был сохранен в [0..3]?

Ответы [ 4 ]

4 голосов
/ 19 августа 2010
*a_ptr = (int) b_ptr; 

обновлено в комментариях

0 голосов
/ 19 августа 2010

Хотя есть лучшие способы сделать это, это, вероятно, ближе всего к вашему подходу

   int main(){
    char *a[100];        // not char but char * 
    char b[100]; 
    b[0] = 42;          // Some value for us to use 

    char** a_ptr = (char **)&a[0];    // Store the address of a[0] in a_ptr 
    char* b_ptr = (char*)&b[0];       // Store the address of b[0] in b_ptr 

    *a_ptr = b_ptr;
    }
0 голосов
/ 19 августа 2010

Yikes - что за беспорядок. Если a и b являются массивами char, то вы не хотите создавать для них int s ... int - это область памяти, большая чем char, и когда вы читаете, вы выбираете другие значения рядом символ и в конечном итоге с эффективно случайным значением. Если вы попытаетесь сохранить значение в int , вы закроете значение char (возможно, непреднамеренным значением), а несколько значений вокруг него.

Очень хорошая идея не использовать приведение в стиле C (например, "(int *)") при изучении C ++. Если вы используете static_cast <>, компилятор может сообщить вам, когда вы допустили большую ошибку.

Итак, что вы хотите:

  char* p_a = &a[0];
  char* p_b = &b[0];
  *p_a = *p_b;  // copy
0 голосов
/ 19 августа 2010

Неважно ... очевидно, слишком поздно.

Чтобы решить, измените

 *a_ptr = (int)&b_ptr;

до

*a_ptr = (int)b_ptr; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...