C指针转换:指向double char指针的单个int指针

时间:2014-11-06 05:24:05

标签: c pointers

我正在尝试执行以下操作,它不会给我编译错误但在运行时会给我一个分段错误。

int main(){
int * ptr;
*ptr = 254;
char **ch = (char **)ptr;
printf("\n%x\n",**ch);
}

我基本上想知道这样的事情是否合法,如果是这样的话。

*(char **)ptr

其中 ptr 的类型为 int 或类型 void

3 个答案:

答案 0 :(得分:0)

*ptr = 254;此处ptr未分配内存,这就是产生分段错误的原因。

首先,您需要将内存分配给ptr,然后您可以将一些值放入*ptr

接下来,*(char **)ptr不合法(char **ch = (char **)ptr;,BTW都不合法)。如果在启用警告的情况下进行编译,则会收到一些警告消息

  

警告:从不兼容的指针类型初始化

如果您尝试分析任一变量的数据类型,您可以轻松理解这一点。考虑一个示例代码

#include <stdio.h>
#include <stdlib.h>

    int main(){
            int * ptr = malloc(4);
            *ptr = 254;
            char **ch = (char **)ptr;
            printf("\n%x\n",**ch);
    }

要检查,如果编译并单步执行调试器,则可以看到

5           int * ptr = malloc(4);
(gdb) s
6           *ptr = 254;
(gdb) 
7           char **ch = (char **)ptr;
(gdb) p ptr
$1 = (int *) 0x804a008
(gdb) p ch
$2 = (char **) 0xa7c600
(gdb) p *ch
$3 = 0x57e58955 <Address 0x57e58955 out of bounds>
(gdb) p **ch
Cannot access memory at address 0x57e58955

答案 1 :(得分:0)

变量ptr未初始化。

指针是存储地址的变量。

此处变量ptr未初始化为任何值。

当它试图访问ptr时,肯定会崩溃。

因为ptr有一个垃圾邮件地址值,而你正试图访问它。

使用给定的代码,这一定是问题。

但问题不在于将类型转换为char **。

答案 2 :(得分:0)

您的代码中很少需要设置:

  1. ptr是一个指针,它应该指向你的情况下它没有这样做的一些内存位置。所以你需要分配一些内存,然后你需要访问指针。
  2. 您正在尝试使用字符指针指向整数指针。现在这个字符指针只有1个字节的数据可以访问,而不是更多。(整数变量的大小可能因平台而异)。
  3. 看看下面的代码:让我们假设您使用malloc动态分配一些内存,或使用指针指向某个位置,如下所示。

    #include<stdio.h>
    #include<string.h>
       int main(){
          int a =10;
          int * ptr = &a; 
          *ptr = 81;/* ASCII value of Q is 81 */
          printf("%d\n",a);
          char **ch = (char **)&ptr;/* Pointer pointing to a pointer */
          printf("%c\n",**ch);/* You will see Q getting printed */
          /* Now if you want to modify the value of a it can be done */
          **ch = 'R';
          printf("%d\n",a); /* The value stored in a will be 82 ASCII value of R */
          printf("%c\n",**ch);
          printf("%d\n",**ch); /* You should get 82 here */
          /* Now lets say you try to set a to value 290 */
          a = 290;
          printf("%d\n",a);/* You get 290 here */
          printf("%d\n",**ch); /* Sorry you won't get 290 here */ 
          printf("%c\n",**ch); 
          /* Since only 1 byte is what char pointer can access you get equivalent ASCII value for the value matching 8 bits */
       }