相关疑难解决方法(0)

关于类成员函数指针的sizeof

假设我们有A级

class A;
Run Code Online (Sandbox Code Playgroud)

和这些typedef

typedef void (A::*a_func_ptr)(void);
typedef void (*func_ptr)(void);
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么sizeof(a_func_ptr)返回16,而sizeof(func_ptr)返回4(对于x86系统上的任何指针)?

例如

int main(int argc, char *argv[])
{
  int a = sizeof(a_func_ptr);
  int b = sizeof(func_ptr);
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers class sizeof member

10
推荐指数
1
解决办法
6052
查看次数

reinterpret_cast可以更改对象表示吗?

我的心智模型reinterpret_cast一直是,将表达式的位序列视为不同类型,并且cppreference(注意:这不是C++标准中的引用)似乎同意这一点:

不像static_cast,但是const_cast,reinterpret_cast表达式不会编译到任何CPU指令.它纯粹是一个编译器指令,它指示编译器将表达式的位序列(对象表示)视为具有new_type类型.

寻找保证,我偶然发现[expr.reinterpret.cast]下的一个注释:

[  注意:由may执行reinterpret_­cast或可能不执行的映射会生成与原始值不同的表示.-  结束说明  ]

这让我想知道:在哪个条件下reinterpret_cast产生的值与对象表示不同于原始值?

c++ language-lawyer

9
推荐指数
1
解决办法
314
查看次数

将Unity C#中的字节数组传递给C++库方法

我有一个C++库方法,我想从Unity C#脚本调用.

我知道有三个关键步骤.首先,声明C++方法extern "C".二,[DllImport('foobar')]在相应的C#extern方法声明之前使用.第三,使用lib前缀(例如libfoobar.so)命名库文件并将其放在Unity插件文件夹中.

到目前为止一切都那么好 - 如果我只是将简单的参数类型int从C#传递到C++中.但是,要传递byte[]参数,我需要考虑C#和C++处理内存和指针的不同方式.我无法找到一个如何做到这一点的明确例子.

我的问题:如何将byte[]Unity C#脚本传递给外部C++库方法?

c# c++ mono bytearray unity-game-engine

6
推荐指数
2
解决办法
7530
查看次数

为什么C指针被推荐为它们所指向的数据的类型,如果它们是8字节大而不管?

所以我正在学习C指针,我有点困惑.指针只指向特定的内存地址.

sizeof(char*),sizeof(int*),sizeof(double*)所有输出8.所以它们都占用8字节来存储内存地址.

但是,如果我尝试编译这样的东西:

int main(void)
{
    char letter = 'A';
    int *a = &letter;
    printf("letter: %c\n", *a);
}
Run Code Online (Sandbox Code Playgroud)

我收到编译器(gcc)的警告:

 warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
     int *a = &letter;
Run Code Online (Sandbox Code Playgroud)

但是,char *a = &letter;不会导致警告.

为什么指针的类型很重要,如果它的8字节长呢?为什么声明一个类型不同于它所指向的数据类型的指针会在警告中产生?

c pointers

2
推荐指数
1
解决办法
66
查看次数

为什么我在32位Mac OS X系统上看到C++中的64位指针?

所以我在SO和其他地方阅读了很多相关的帖子,例如:

sizeof(某些指针)总是等于4吗?

对我来说,在32位系统上,我期望4字节指针,在64位系统上,我期望8字节指针.所以我正在运行这段代码:

int main()
{
  cout << "sizeof(int) = " << sizeof(int) << endl;
  cout << "sizeof(void*) = " << sizeof(void*) << endl;
}
Run Code Online (Sandbox Code Playgroud)

这是相应的输出:

sizeof(int) = 4
sizeof(void*) = 8
Run Code Online (Sandbox Code Playgroud)

我在Mac OS X 10.6.1上以32位模式运行.这是"uname -a"的输出:

Darwin brent-nashs-macbook.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:47:34 PDT 2009; root:xnu-1456.1.25~1/RELEASE_I386 i386 i386
Run Code Online (Sandbox Code Playgroud)

这是我正在运行的g ++版本(系统附带的默认版本):

i686-apple-darwin10-g++-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5646)
Run Code Online (Sandbox Code Playgroud)

所以我意识到指针的大小不能保证从系统到系统,并且它们完全依赖于编译器和体系结构,但这种结果是否会使其他人感到不合逻辑呢?这只是Mac OS X 10.6或我的设置的特质吗?还是有一个很好的理由我看到这么大的指针?

==================================================

答案后补充

任何想要他们的人的额外细节......

我最初使用此命令行编译:

g++ -Wall -o TestClass1 TestClass1.cpp
Run Code Online (Sandbox Code Playgroud)

它产生了这个输出:

sizeof(int) = 4
sizeof(void*) …
Run Code Online (Sandbox Code Playgroud)

c++ macos x86 pointers

1
推荐指数
1
解决办法
1345
查看次数

C++干净的指针算术

什么是在C++中执行指针运算最干净的方法?我正在尝试将n字节添加到地址.

int *foo;
foo = static_cast<int*> (static_cast<unsigned int>(foo) + sizeof(T))
Run Code Online (Sandbox Code Playgroud)

之后你可以重铸并以不同的方式使用foo

char* somestr = reinterpret_cast<char*>(foo)
Run Code Online (Sandbox Code Playgroud)

这够好吗?现在我理解指针实现dosent保证所有指针(char*,int*)都实现相同的大小.所以不确定是否int*(应该是foo*)并且使用unsigned int进行数学运算是最干净的解决方案.此外,它必须兼容32位和64位.

没关系为什么我这样做.虽然不是那么不寻常.当您使用动态解释为不同类型的数据流(或字节池)时,您将遇到此问题.

c++ linux pointers

1
推荐指数
1
解决办法
893
查看次数

在Objective-C/C中无法正确malloc

我有一个OpenGL程序,但无法正确分配.

m_VertexData = (GLfloat*)malloc(sizeof(m_TempVertexData));
m_NormalData = (GLfloat*)malloc(sizeof(m_TempNormalData));
NSLog(@"sizeOfTempVertex: %d sizeOfTempNormal: %d", sizeof(m_TempVertexData),sizeof(m_TempNormalData));
NSLog(@"sizeOfVertex: %d sizeOfNormal: %d",sizeof(m_VertexData),sizeof(m_NormalData));
Run Code Online (Sandbox Code Playgroud)

NSLog的:

sizeOfTempVertex:432 sizeOfTempNormal:432

sizeOfVertex:4 sizeOfNormal:4

c malloc objective-c

1
推荐指数
1
解决办法
784
查看次数

为什么通过使用printf(%x)指针的值不同?

#include <stdio.h>
int main(void)
{
  int *ptr;
  printf("The Hex value of ptr is 0x%x",ptr);
  printf("The pointer value of ptr is %p",ptr);
}
Run Code Online (Sandbox Code Playgroud)

和输出有些不同,我不知道为什么

The Hex value of ptr is 0x24a77950
The pointer value of ptr is 0x7fff24a77950
Run Code Online (Sandbox Code Playgroud)

它显示ptr的值是一个十六进制整数,但是十六进制输出缺少part 7fff

这是printf格式问题还是其他?

c printf pointers

0
推荐指数
1
解决办法
1172
查看次数

为什么sizeof报告不同变量的相同大小(8个字节)?

我是C的新手,我试图说明int/long/short有多少字节.请记住,我必须有变量,所以我不能只说sizeof(int).任何帮助将不胜感激!

#include <stdio.h>

int main()
{
short* A;
int* B;
long* C;

printf("Size of integer variable = %d bytes\n", sizeof(A));
printf("Size of integer variable = %d bytes\n", sizeof(B));
printf("Size of integer variable = %d bytes\n", sizeof(C));
return 0;
}
Run Code Online (Sandbox Code Playgroud)

c byte sizeof

0
推荐指数
1
解决办法
89
查看次数