【问题标题】:Difference between (int *)p and &p(int *)p 和 &p 的区别
【发布时间】:2018-10-27 17:49:29
【问题描述】:

语句之间有什么区别 int *p = (int*) i; and int *q=&i; 这是整个程序

#include<stdio.h>
int main(){
     int i;
     int *p = (int*) i; 
     printf("\n p is %d ",p);
     int *q = &i;
     printf("\n q is %d ",q);
     return 0;
 }

得到的输出是 p is 22092 q is 1002476148 我认为这里 p 和 q 都存储了 i 的地址,但是它们显示了不同的值,有人可以解释为什么会这样吗?

【问题讨论】:

  • 所以如果 (int *) i 返回 i 中的值,那么这个 (int *) 的实际用途是什么,比如它的使用位置
  • 因为i是默认初始化的,它将包含随机值,该值也被存储到指针p,这就是你得到两个值的原因。

标签: c pointers memory-address


【解决方案1】:

首先:指针必须转换为(void*) 并打印为%p%d 以 10 为基数打印 int。也就是说,

#include <stdio.h>

int main(){
    int i;
    int *p = (int*) i; 
    printf("\n p is %p ", (void*)p);
    int *q = &i;
    printf("\n q is %p ", (void*)q);
}

现在让我们尝试编译带有这些更改的程序:只有 2 个错误:

% gcc ptr.c -Wall -Wextra
ptr.c: In function ‘main’:
ptr.c:5:14: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
     int *p = (int*) i;
              ^
ptr.c:5:14: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
     int *p = (int*) i;
              ^~~~~~~~

两者都与int *p = (int*) i; 相关;第二个表示使用了i 的值,但我们没有为i 设置任何值(这会导致未定义的行为),另一个表示我们正在尝试将整数转换为一个指针,并且整数的位数与此平台上的指针的位数不同。

int *q = &i;

用变量i的地址初始化指向int q的指针,而

int *p = (int*) i; 

以实现定义的方式将i中包含的垃圾值解释为地址,并用该地址初始化p

不完全相等。

【讨论】:

  • 如此插入 pthread_create(&philosopher[i],NULL,(void *)process,(int *)i );我可以使用 pthread_create(&philosopher[i],NULL,process,i );而是
  • @AdarshD for pthread_create: stackoverflow.com/a/19236285/918959
【解决方案2】:

这里

int *p = (int*) i; /* i is not initialized */

指针p 被赋值为i,这是一些垃圾数据并尝试将一些垃圾数据转换为int* 类型并分配给p。如果您尝试取消引用 p,它会给出 分段错误 并导致 未定义的行为

这里

int *q = &i;

指针q 分配了有效地址。

在打印指针变量时,例如使用 %p 而不是 %d 格式说明符

 printf("\n q is %p ",(void*)q);

关于将 整数值 分配给像 int *p = (int*) i 这样的指针C 标准

6.3.2.3 指针

(5) 整数 可以转换为任何指针类型。除了作为 之前指定,结果是implementation-defined,可能 未正确对齐,可能未指向 引用类型,并且可能是陷阱表示。

【解决方案3】:

根据 C 标准 ISO/IEC 9899:2011,子条款 6.3.2.3:

整数可以转换为任何指针类型。除非前面指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是陷阱表示。

因此,当您将i 转换为pointer-to-int 类型时,它所持有的内容通常是未定义的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 2021-12-30
    • 2016-01-23
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多