相关疑难解决方法(0)

intptr_t有什么用?

我知道它是一个整数类型,可以在不丢失数据的情况下强制转换为指针,但为什么我要这样做呢?使用整数类型有什么优势void*可以保存指针和THE_REAL_TYPE*指针算术?

编辑
标记为"已被询问"的问题没有回答这个问题.问题是如果使用intptr_t作为一般的替换void*是一个好主意,那里的答案似乎是"不要使用intptr_t",所以我的问题仍然有效:什么是一个很好的用例intptr_t

c c++ pointers

25
推荐指数
5
解决办法
2万
查看次数

使用intptr_t而不是void*?

使用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

我还应该考虑什么呢?

c pointers void-pointers intptr 32bit-64bit

23
推荐指数
2
解决办法
3万
查看次数

如何解决:C代码中"从不同大小的整数转换为指针"警告?

我正在从遗留代码中删除gcc警告.

是否可以通过类型转换来抑制警告"从不同大小的整数转换为指针":

example:

some_struct *ptr = func()  // func() returns an integer.
Run Code Online (Sandbox Code Playgroud)

有人可以指导我如何解决这样的gcc警告?

c pointers gcc-warning

10
推荐指数
2
解决办法
7万
查看次数

在64位指针中使用额外的16位

我读到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个字节用于密钥(由于对齐限制),可以将密钥嵌入到指针中.

64-bit pointers x86-64 memory-access

6
推荐指数
3
解决办法
4559
查看次数

将指针的地址存储在C中的unsigned int中

是否可以将指针强制转换为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)

c casting pthreads

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

将int转换为指针

我想将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

c++ pointers

4
推荐指数
2
解决办法
3万
查看次数

创建指向给定地址的指针时出现问题

我正在尝试创建一个指向用户给定的内存地址的指针,但我遇到了问题。我实际上设法创建指针并打印其地址,但我从未成功打印或更改其内容。有没有好心人解释一下为什么?

这是我试图运行的代码:

    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 不同的地址,也会发生同样的事情。

谢谢!

c pointers memory-management segmentation-fault

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