2014-11-06 158 views
0

我正在尝试执行以下操作,它不会给我编译错误,但在运行此操作时会出现分段错误。C指针铸造:单个int指针双字符指针

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

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

*(char **)ptr 

其中PTR是两种类型的INT或类型无效

回答

0

*ptr = 254;这里ptr未分配的内存,这就是为什么制造分段错误。

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

接下来,*(char **)ptr是不合法的(均不是char **ch = (char **)ptr;,BTW)。如果你有警告编译启用后,您会得到一些警告信息

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

您可以easlity明白这一点,如果你尝试分析任何变量的数据类型。考虑一个示例代码

#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 
0

变量PTR未初始化。

指针是一个存储地址的变量。

这里变量ptr未初始化为任何值。

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

因为ptr具有垃圾地址值,并且您正在尝试访问该垃圾地址值。

对于给定的代码,这一定是问题。

但问题不在于将类型转换为char **。需要就在你的代码中设置

+0

我也猜到了,我宣布和'int i',并有ptr指向我。它编译和工作bt与警告 'printf(“\ n%x \ n”,(unsigned int)&ch);' 'printf(“\ n%x \ n”,(unsigned int)&*ch);' 它给了我从指针转换为不同大小的整数警告。有些帮助请。 – CodeWithPride 2014-11-06 06:39:38

0

几件事情:

  1. PTR是一个指针,so.So您需要分配一些内存应该指向你的情况是不是做一些内存的位置和那么你需要访问指针。
  2. 您正在尝试使用字符指针指向整数指针。现在这个字符指针将只有1个字节的数据可以访问,并且不会超过这个数量(整数变量的大小可能会在不同的平台上有所不同)。

看看下面的代码:假设你使用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 */ 
    }