我正在嘗試執行以下操作,它不會給我編譯錯誤,但在運行此操作時會出現分段錯誤。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