我想查看计算机上数据类型的大小。 因此,我从使用以下代码的int数据类型开始:

#include <iostream>
using namespace std;
int main()
{
int t, *tpntr1, *tpntr2;
tpntr1 = &t;
cout << "The first address: \t" << tpntr1;
tpntr2 = ++tpntr1;
cout << "\n The second address : \t" << tpntr2;
unsigned int size= (tpntr2 - tpntr1);
cout << "\n the size of int : \t" << size<<"\n";
return 0;
}

在Visual Studio中编译后,大小返回为0。在特定的运行中,第一个地址为0028FBA4,第二个地址为0028FBA8,但差值为零。 有人可以指出我在做什么错吗? 我猜它与十六进制到十进制转换有关。

===============>>#1 票数:0

这是一个提示:将cout移到末尾以查看发生了什么:

#include <iostream>
using namespace std;
int main()
    {
    int t, *tpntr1, *tpntr2;
    tpntr1 = &t;
    tpntr2 = ++tpntr1;
    unsigned int size= (tpntr2 - tpntr1);
    cout << "The first address: \t" << tpntr1;
    cout << "\n The second address : \t" << tpntr2;
    cout << "\n the size of int : \t" << size<<"\n";
    return 0;
}

地址是相同的。 您实际上是将tpntr2分配给tpntr1

如果将tpntr2 = ++tpntr1更改为

tpntr2 = tpntr1;
tpntr2++;

它将部分执行您想要的操作。 请注意,这将打印1作为尺寸。 我可能会弄错,但是指针算法会考虑类型的大小(如果不是这种情况,请纠正我。否则我将无法解释)。

===============>>#2 票数:0

正如Carcigenicate指出的那样,您的主要问题是++会修改值。 但是,由于指针算法的工作原理,您可能也无法获得所需的结果。

更正的形式为:

tpntr1 = &t;
tpntr2 = tpntr1;
tpntr2++;

但是,您的结果将为1,因为tpntr2 - tpntr1将返回tpntr2 - tpntr1之差。 因为int是4个字节(至少在我的实现中),所以即使内存地址相隔4个字节,也会打印出差异为1。

如果需要实际的字节数(将为4),则需要强制转换为将绕过此行为的类型。 您有两种选择:将指针转换为int,这将使其成为对数字的简单数学运算,或者reinterpret_cast<char*> ,这将告诉它将指针视为内存的一个字节。 例如,这将显示为4:

int main()
    {
    int t, *tpntr1, *tpntr2;
    tpntr1 = &t;
    tpntr2 = tpntr1;
    tpntr2++;
    unsigned int size= (reinterpret_cast<char*>(tpntr2) - reinterpret_cast<char*>(tpntr1));
    cout << "The first address: \t" << tpntr1;
    cout << "\n The second address : \t" << tpntr2;
    cout << "\n the size of int : \t" << size<<"\n";
    return 0;
}

  ask by Arpit Chadha translate from so

未解决问题?本站智能推荐:

1回复

如何使用模板参数成员的类型?

我的函数如下所示: T和U类型的示例如下所示: 其中T是类,它具有名为data的成员。 data类型为U 目前必须使用两个类型参数来调用我的函数: 但是第二种类型参数(U)是第一种类型(T)内部data变量的类型。 是否可以从模板中删除U并使用例如decltyp
1回复

如何使用模板编程创建多类型数组

我们可以使用void *或void **创建一个多类型的数组,例如-(在“ C编程中也使用C ++编程”) 因此,我们可以将任何指针类型强制转换为void *类型,并将地址存储在void **中,然后将其从数组强制转换回以正确使用它们。 就像明智的做法一样,在现代C ++中,我们是否有
1回复

使用constexpr数组作为模板非类型参数(C ++ 14)

这个程序编译精细,打印5与gcc 5.1及更高版本,但MSVC 19.10.25019给出以下错误: 错误C2975:'S':'arr'的模板参数无效,预期编译时常量表达式错误C2131:表达式未计算为常量 这个程序是否符合C ++ 14标准,或者gcc在这里太宽松了?
2回复

C ++是否有可能实现指向不同参数列表的函数指针?

我最近写了关于类成员函数回调的函数。 我需要保存回调对象和函数指针,然后调用函数指针并在需要回调的地方填写适当的参数。 我以typedef void (AAA::*Function)(int a, int b); ,但是当我需要支持成员函数的不同参数列表时,显然我需要一种动态的方法来实
3回复

指向成员的指针:在GCC中工作但在VS2015中不起作用

我正在尝试实现一个“属性”系统来将C ++实例转换为JSON,反之亦然。 我在这个问题( C ++ JSON序列化 )中从Guillaume Racicot的答案中获取了部分代码并对其进行了简化。 以下是我的进展方式。 我有一个Property类: m_member指向Clas
2回复

创建一个没有默认构造函数的类的智能指针数组

我指的是这个问题 ,我们可以创建一个std::unique_ptr数组到一个已删除默认构造函数的类,如下所示,如何传递string参数。
2回复

正确转换为指向返回函数的函数的函数指针

我正在反转源代码,并且发现了一个看起来像这样的函数: 考虑一下: 好吧,那我就需要对rtx()做一个指针函数来做一个钩子,然后我就做了这样的事情: 但是我的编译器没有编译它,所以我尝试做: 好吧,我要说的是,'我如何不使用typedef就可以进行正确的转换?
1回复

具有协变返回类型的方法在VC ++上崩溃

当使用clang或gcc(在macOS上)编译时,以下代码似乎运行正常,但在使用MS Visual C ++ 2017编译时崩溃。在后者上,foo_clone对象似乎已损坏,程序崩溃时出现访问冲突foo_clone->get_identifier() 。 如果我删除协变返回类型(所有
1回复

标准C ++ 14中零大小数组的解决方法?

我正在为Google的V8 ECMAScript引擎开发绑定工具包。 考虑以下模板函数: 它使用可变数量的参数,并使用辅助函数将它们映射到v8 :: Value对象的数组。 (参数可以具有任意类型,只要它们可以被to_js_value识别to_js_value )当我使用GCC或Cl
6回复

基于模板参数类型调用函数

有两个“C”功能: 然后有一个包装模板函数: 如果调用者调用foo("Abc") ,则此模板函数应对fooA进行编译时调用。 同样地, foo(L"Abc")应该最终调用fooW 。 我怎么做? 我想过使用std::conditional但是无法做到。 我不能使f