2014-02-11 69 views
0

唷!我有以下代碼:如何將字符指針分配給字符變量?

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h> 
int main() 
{ 
    char t[10] = "John"; 
    char x = t; 
    printf("%c\n", x); 
    return 0; 
} 

編譯器不能在這裏給我一個錯誤?此外,printf語句正在輸出不同的結果。到底什麼是分配給變量x?

+0

已經有一段時間我處理c打開所有警告變爲錯誤,但X可能是一個字節指針't'。如果你打印出't',你會發現'x'對應於某種方式。 –

+0

@MarcB這是正確的。 'x'將以't'的地址的低位結束。 –

+0

它應該會在幾乎所有編譯器的默認警告級別上產生警告,但它不會產生錯誤,因爲它不是錯誤。錯誤的代碼,是的,但沒有錯誤。 –

回答

2

如果有警告編譯你會得到如下抱怨:

警告:初始化將指針整數,未作施放[默認啓用]

它沒有理由失敗編譯是因爲三件事引擎蓋下發生:

  • 第一陣列衰減到指針(數組和指針是相同,但陣列「衰變」的指針在必要時),
  • 則該指針被轉換爲整數,
  • 最後整數轉換爲char並分配給x

從整數到字符的轉換是沒有問題(和它發生的時間,因爲用C字符常量實際上int多個),而是一個指針轉換爲整數是很少會程序員的意圖,因此警告。這不是嚴格錯誤,但也不是很有意義。

因此,最後printf打印t的第一個元素的地址剩下的東西。

-1

在C中,大多數時候數組的名字意味着一個指向其第一個元素的指針。將一個指針指向一個整數是合理的,並且在C中,即使可能代碼不正確,它也只是一個整數。在任何情況下,這裏的gcc-4.8.2-7.fc19.x86_64告訴我:

$ gcc -c xxx.c 
xxx.c: In function ‘main’: 
xxx.c:6:14: warning: initialization makes integer from pointer without a cast [enabled by default] 
char x = t; 
     ^

而鐺-3.3-4.fc19.x86_64雲:

$ clang -c xxx.c 
xxx.c:6:10: warning: incompatible pointer to integer conversion initializing 
     'char' with an expression of type 'char [10]' [-Wint-conversion] 
    char x = t; 
     ^ ~ 
1 warning generated. 

沒有錯誤,但可怕的警告。

2

在c中,指針是標量值,所以是char,所以是int。標量基本上意味着它是一個數字。所有的標量都可以被添加,相乘等。總有一種方法可以從一個標量轉換爲另一個標量。

當您這樣做時 char x = t; 它隱式地將指針t轉換爲char。變量x將包含指針的8個最低有效位。

不同的編譯器處理標量轉換的方式不同。有時他們會要求你明確地施展一個到另一個。例如char x = (char)t;如果隱式轉換導致精度損失,有些會給你警告。 (從int到char的轉換可能會失去精度,但從char轉換爲int的轉換不會失去精度)當您嘗試隱式轉換任何內容時,某些編譯器會給您一個錯誤。

您是否收到錯誤或警告取決於您的編譯器和編譯器的設置。嘗試啓用警告。

在GCC您可以通過添加-Wall編譯的命令使所有的警告,或者您可以通過添加-Werror

+0

謝謝!非常好的解釋 – user2684198

相關問題