我正在尝试执行以下操作,它不会给我编译错误,但在运行此操作时会出现分段错误。C指针铸造:单个int指针双字符指针
int main(){
int * ptr;
*ptr = 254;
char **ch = (char **)ptr;
printf("\n%x\n",**ch);
}
我基本上想知道这样的事情是否合法,如果是这样的话。
*(char **)ptr
其中PTR是两种类型的INT或类型无效
我正在尝试执行以下操作,它不会给我编译错误,但在运行此操作时会出现分段错误。C指针铸造:单个int指针双字符指针
int main(){
int * ptr;
*ptr = 254;
char **ch = (char **)ptr;
printf("\n%x\n",**ch);
}
我基本上想知道这样的事情是否合法,如果是这样的话。
*(char **)ptr
其中PTR是两种类型的INT或类型无效
*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
变量PTR未初始化。
指针是一个存储地址的变量。
这里变量ptr未初始化为任何值。
当它试图访问ptr时,它肯定崩溃。
因为ptr具有垃圾地址值,并且您正在尝试访问该垃圾地址值。
对于给定的代码,这一定是问题。
但问题不在于将类型转换为char **。需要就在你的代码中设置
几件事情:
看看下面的代码:假设你使用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 */
}
我也猜到了,我宣布和'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