2014-11-06 222 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 */ 
    }