在数组中获取并存储内存地址的问题

时间:2010-08-19 04:29:44

标签: c++ c arrays pointers

所以,我有一些指针问题。 我正在编写一个在[]中存储内存地址的函数。 这些内存地址指向b []中的实际数据值。 我无法从b获取内存地址存储在。

// 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 个答案:

答案 0 :(得分:4)

*a_ptr = (int) b_ptr; 

根据评论更新

答案 1 :(得分:0)

没关系......显然为时已晚。

要解决,请更改

 *a_ptr = (int)&b_ptr;

*a_ptr = (int)b_ptr; 

答案 2 :(得分:0)

Yikes - 多么糟糕。如果a和b是char数组,那么你不想为它们创建int ... int是一个比char更大的内存区域,当你读到它时你会在旁边拾取其他值char并最终得到一个有效的随机值。如果你试图存储到int ,你将破坏char的值(可能带有非预期的值),同时破坏它周围的几个值。

在学习C ++时,不要使用C风格的强制转换(例如“(int *)”)是个好主意。如果你使用static_cast<>编译器可以告诉你何时犯了大错。

所以,你想要的是:

  char* p_a = &a[0];
  char* p_b = &b[0];
  *p_a = *p_b;  // copy

答案 3 :(得分:0)

虽然有更好的方法可以做到这一点,但这可能是最接近你的方法

   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;
    }