2014-09-22 60 views
0

我編譯如下代碼:指針常量用C

#include <stdio.h> 

int main(void) { 
    // your code goes here 

    char *consta = "ABC"; 

    printf("Use of just const: %c\n", consta); 
    printf("Use of const[1]: %c\n", consta[1]); 
    printf("Use of whole string: %s", consta); 

    return 0; 
} 

但是,我得到的輸出是:

Use of just const: P 
Use of const[1]: B 
Use of whole string: ABC 

第二printf和但預期第三printf函數調用工作,我在第一次調用printf時期待'A'被打印而不是'P'。

+2

未定義行爲再次觸發。 – alk 2014-09-22 16:33:27

+0

你需要這個:http://www.amazon.ca/C-Primer-Plus-5th-Edition/dp/0672326965你目前是否參加了一門關於C的課程,或者只是教給你自己? – DevNull 2014-09-22 16:35:17

+3

* printf *函數不是類型安全的。在編譯器中啓用所有警告。 – 2014-09-22 16:35:18

回答

2

consta是指向一個字符的指針。格式指定符%c需要char(字符)而不是char*(指向字符的指針)的參數。您的代碼展示未定義的行爲。嘗試取消引用consta代替:

printf("Use of just const: %c\n", *consta); 

其中*consta是incidentially等於consta[0]

†實際上,參數類型爲int,並且由printf()轉換爲unsigned char。這與適用於具有可變參數的函數的參數提升規則有關; 類型的printf()的參數在傳遞到printf()之前被提升爲int,這就是爲什麼printf()必須將其提升回來。對於大多數程序來說,差異並不重要。

2

consta是包含字符串地址的指針。

您正在告訴printf將此視爲一個字符,這是未定義的行爲。指針通常被實現爲將地址存儲爲數字,所以它通常會打印該地址的ASCII值。

您想通過編寫*consta來傳遞該地址的值(指針指向)。

+2

'consta'不是一個數字,而是一個指針。此外,您至少應該提到代碼具有未定義的行爲,以及爲什麼以及這意味着什麼,然後再說明它將如何在一個特定的實現中發揮作用。 – Deduplicator 2014-09-22 16:45:02

+0

@Deduplicator:這是否更好? – SLaks 2014-09-22 16:48:13

+0

是的,非常非常。 – Deduplicator 2014-09-22 16:48:37

0
char *consta = "ABC"; 

是指向char指向"ABC",準確到的"ABC"的第一元素,即'A'

「指向」意味着consta包含一個地址,這裏的地址是'A'

要打印一個指針,會說一個地址,使用轉換符%p

printf("Use of just const: %p\n", (void*) consta); 
0

我可以當場三個問題與您的代碼:

  1. 變量consta指向一個常數所以你應該使它成爲一個常數:

    const char *consta = "ABC"; 
    
  2. 的第二個參數的第一個print語句應該是字符串,而不是一個指針的第一個字符:

    printf("Use of just const: %c\n", consta[0]); 
    
  3. 在過去的print語句還沒有最終的換行符。這意味着它可能沒有輸出。

如果你想你的代碼是標準ANSI C符合的,你還需要更改行註釋(//...)的塊註釋(/*...*/)。

在編譯器中啓用所有警告也是一個好主意。使用流行的GCC編譯器我使用以下選項:

-ansi -fsanitize=address -g -pedantic -Wall -Wfatal-errors 
+1

ANSI C不是C最古老的標準嗎?人們不應該跟上更新的標準嗎? – 2014-09-22 17:03:55

+0

@mafso謝謝。我改變了它。 – 2014-09-22 18:28:37

+0

@AnasAyubi如果你用ANSI C編寫,你可以用任何當前的C編譯器編譯你的代碼。 C99不適用。 – 2014-09-22 18:38:49