我想在内存中找到结构元素的地址 这是我的代码
#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 ==========
请帮助
答案 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;