不同类型结构元素的地址

时间:2010-10-11 12:24:26

标签: c++

我想在内存中找到结构元素的地址 这是我的代码

  #include <iostream>
using namespace std;
struct B{
int k;
float t;
char s;
unsigned int m;
long q;
double x;
unsigned long z;
};

int main(){    
    B   b[]={3,4.23,'A',123,123L,23.340,700};
    void *t=&b[0];
    void *n=&b[0]+7;
    while(t!=n){        
        cout<<t<<endl;
        t++;    
    }
    return 0;
}

我不知道它是否是正确的代码,这里也是错误

1>------ Build started: Project: tests, Configuration: Debug Win32 ------
1>  tests.cpp
1>c:\users\7\documents\visual studio 2010\projects\tests\tests\tests.cpp(16): warning C4305: 'initializing' : truncation from 'double' to 'float'
1>c:\users\7\documents\visual studio 2010\projects\tests\tests\tests.cpp(22): error C2036: 'void *' : unknown size
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

请帮助

3 个答案:

答案 0 :(得分:4)

你不能递增一个void指针(while循环中的最后一条指令),因为编译器无法知道它必须增加多少。

结构元素的地址可以使用&运算符作为正常变量:

std::cout << "Address of b.k: " << (void*)&b.k << std::endl

要获取成员的偏移量,请使用offsetof宏。

#include <iostream>
#include <cstddef>

struct B{
    int k;
    float t;
    char s;
    unsigned int m;
    long q;
    double x;
    unsigned long z;
};

int main()
{
    B b={3,4.23,'A',123,123L,23.340,700};

    std::cout << "Address of b: " << (void*)&b << std::endl;
    std::cout << "Offset of k:  " << offsetof(B, k) << std::endl;
    std::cout << "Offset of t:  " << offsetof(B, t) << std::endl;
    std::cout << "Offset of s:  " << offsetof(B, s) << std::endl;
    std::cout << "Offset of m:  " << offsetof(B, m) << std::endl;
    // etc...

    return 0;
}

答案 1 :(得分:0)

4.23默认为double。您可以指定4.23F来删除第一个警告。请参阅this reference on literal constants

使用t++增加指向未知类型元素的指针是浪费时间。你永远不会成功。

你可以做的是在你的结构中实现一个方法,逐个打印其元素的地址。

答案 2 :(得分:0)

对结构(void *n=&b[0]+7;)的算术运算很危险:您无法确定编译器如何对齐和打包结构的字段。

此外,您无法在void指针(t++;)上使用指针算法。

更好,即使不是非常“面向对象”,也会是:

B* pB = &b[0] + sizeof(B) * 7;