2014-09-22 81 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