为什么我得到数组元素的位置而不是它的值? C

时间:2018-06-06 15:28:18

标签: c arrays string gcc char

#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h = c[4];
    printf("%s",h);

} 为什么h会导致元素的位置,而不是值?错误是:警告:格式'%s'需要类型为'char *'的参数,但参数2的类型为'int'[-Wformat =]

2 个答案:

答案 0 :(得分:0)

声明

printf("%s",h);

引起警告,如您所述

  

警告:格式'%s'需要类型为'char *'的参数,但参数为2   类型'int'[-Wformat =]

因为h被声明为char类型而打印字符变量格式说明符是%c。因此,使用%c代替%s,因为%s期望char*类型的参数不是char类型。

为什么h会导致元素的位置,而不是值?否如果你像printf("%c\n",h);一样打印它会打印c[4]所持有的值。

答案 1 :(得分:0)

您没有获得该位置,您将从您的记忆中获取一个随机数。

char h是一个字符。

char[]char*是一系列字符开头的地址(内存位置),一个接一个。

%s希望您提供char*

您正在给它h,一个char

因此,计算机的作用(出于历史原因)是它可以让你逃脱这个,即使它是错误的(这个警告应该是一个错误)。逃避它意味着它需要存储在h中的字符的ASCII值(并且取决于你是在32位还是64位系统上,在内存中跟随该字符的几个随机字节),所以随机数,并将其解释为一系列字符(char*)的内存地址,并尝试打印它。

无论如何,这应该会崩溃,但是你“幸运”,因为你最终遇到的数字似乎是程序中的有效内存地址,所以你要打印一些随机字符。

你应该做的是:

#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h = c[4];
    printf("%c",h); // Change %s to %c, which is for char, not char*
}

或者:

#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h[2] = { 0, 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
    h[0] = c[4];
    printf("%s",h);
}

如果你的编译器足够新,你甚至可以写:

#include <stdio.h>
void main(){
    char c[] = "Hello";
    char h[2] = { c[4], 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
    printf("%s",h);
}

对于最后一个变体,但大多数较旧的编译器无法理解(再次,由于历史原因)。