我知道它是一个整数类型,可以在不丢失数据的情况下强制转换为指针,但为什么我要这样做呢?使用整数类型有什么优势void*可以保存指针和THE_REAL_TYPE*指针算术?
编辑
标记为"已被询问"的问题没有回答这个问题.问题是如果使用intptr_t作为一般的替换void*是一个好主意,那里的答案似乎是"不要使用intptr_t",所以我的问题仍然有效:什么是一个很好的用例intptr_t?
使用intptr_t作为通用存储(保存指针和整数值)而不是void*?(如下所示:http://www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html)
对于我已经读过的内容:
int- > void*- > int往返不保证保持原值; 我猜int- > intptr_t- > int会的void*和intptr_t要求铸件,所以没有在这里得到好处void*表示存储指针时的显式转换次数较少,intptr_t表示存储整数值时转换次数较少intptr_t 需要C99我还应该考虑什么呢?
我正在从遗留代码中删除gcc警告.
是否可以通过类型转换来抑制警告"从不同大小的整数转换为指针":
example:
some_struct *ptr = func() // func() returns an integer.
Run Code Online (Sandbox Code Playgroud)
有人可以指导我如何解决这样的gcc警告?
我读到64位机器实际上只使用48位地址(具体来说,我使用的是英特尔酷睿i7).
我希望额外的16位(位48-63)与地址无关,并将被忽略.但是当我尝试访问这样的地址时,我收到了一个信号EXC_BAD_ACCESS.
我的代码是:
int *p1 = &val;
int *p2 = (int *)((long)p1 | 1ll<<48);//set bit 48, which should be irrelevant
int v = *p2; //Here I receive a signal EXC_BAD_ACCESS.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有没有办法使用这16位?
这可用于构建更多缓存友好的链表.不是将8个字节用于下一个ptr,而是将8个字节用于密钥(由于对齐限制),可以将密钥嵌入到指针中.
是否可以将指针强制转换为unsigned int,然后将其转换回指针?我正在尝试将指针存储到pthread_t变量中的结构,但我似乎无法让它工作.这是我的代码的一些片段(我正在创建一个用户级线程管理库).当我尝试打印出线程的tid时,它给了我一些很长的垃圾编号.
编辑:没关系,我让它工作.
我变了
thread = (pthread_t) currentThread;
Run Code Online (Sandbox Code Playgroud)
至
*thread = (pthread_t) currentThread;
Run Code Online (Sandbox Code Playgroud)
认为这是愚蠢的事情.
测试程序:
pthread_t thread1;
pthread_t thread2;
pthread_create(&thread1, NULL, runner, NULL);
pthread_create(&thread2, NULL, runner, NULL);
pthread_join(&thread2, NULL);
Run Code Online (Sandbox Code Playgroud)
我的图书馆:
typedef struct queueItem
{
int tid;
ucontext_t context;
int caller;
struct queueItem *joiningOn;
struct queueItem *nextContext;
} queueItem;
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
{
thread = (pthread_t) currentThread;
}
...
int pthread_join(pthread_t thread, void **retval)
{
queueItem *t = (queueItem *) thread;
if(runningContext->joiningOn …Run Code Online (Sandbox Code Playgroud) 我想将int值保存到指针变量.但是我收到一个错误:
#include <iostream>
using namespace std;
int main()
{
int *NumRecPrinted = NULL;
int no_of_records = 10;
NumRecPrinted = (int*)no_of_records; // <<< Doesn't give value of NumRecPrinted
cout << "NumRecPrinted!" << NumRecPrinted;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试这样做,但我得到0作为回报:
int main()
{
int demo(int *NumRecPrinted);
int num = 2;
demo(&num);
cout << "NumRecPrinted=" << num; <<<< Prints 0
return 0;
}
int demo (int *NumRecPrinted)
{
int no_of_records = 11;
NumRecPrinted = &no_of_records;
}
Run Code Online (Sandbox Code Playgroud)
NumRecPrinted返回0
我正在尝试创建一个指向用户给定的内存地址的指针,但我遇到了问题。我实际上设法创建指针并打印其地址,但我从未成功打印或更改其内容。有没有好心人解释一下为什么?
这是我试图运行的代码:
int m = 10;
printf("&m = %d (address in dec.)\n", &m);
printf("Enter an address: ");
int address;
scanf("%d", &address);
int* p = (int*) address;
printf("p = %d (address in dec.)\n", p);
printf("*p = %d (value)\n", *p);
Run Code Online (Sandbox Code Playgroud)
这是我与程序交互的控制台:
&m = 1220033252 (address in dec.)
Enter an address: 1220033252
p = 1220033252 (address in dec.)
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用与 &m 不同的地址,也会发生同样的事情。
谢谢!
pointers ×6
c ×5
c++ ×2
32bit-64bit ×1
64-bit ×1
casting ×1
gcc-warning ×1
intptr ×1
pthreads ×1
x86-64 ×1