我正在尝试执行以下操作,它不会给我编译错误但在运行时会给我一个分段错误。
int main(){
int * ptr;
*ptr = 254;
char **ch = (char **)ptr;
printf("\n%x\n",**ch);
}
我基本上想知道这样的事情是否合法,如果是这样的话。
*(char **)ptr
其中 ptr 的类型为 int 或类型 void
答案 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)
您的代码中很少需要设置:
看看下面的代码:让我们假设您使用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 */
}