【问题标题】:passing a character to char *将字符传递给 char *
【发布时间】:2010-12-28 20:56:39
【问题描述】:

我有这段代码

int main()
{
    char a[100];
    a[0]='a';
    a[1]='b';
    fun(a[0]);
}

void fun(char *a)
{
    printf("%c",a);
}

但是我将一个字符传递给一个指针。指针不期望一个地址吗???

【问题讨论】:

  • 你实际上是在发送一个地址。
  • 是的,这可能“仍然有效”,但这只是因为它很幸运。最好专注于正确的做事方式,而不是为什么有时尽管有错误但事情最终还是会奏效。
  • 是的。我只是通过一组代码 sn-ps 并想知道实际的 o/p :)

标签: c pointers char


【解决方案1】:

a[0] 保存值97'a' ASCII 格式)。 fun 将在a 中接收值97,但将其解释为地址。但是,由于您只是将它传递给printf,并且碰巧错误地使用了%c 格式化程序,它将a 解释为char,因此无论如何您最终都会打印a

当然,在大多数编译器上,您应该会收到以下警告:

  1. 您正在将整数转换为指针(当您调用 fun 时)而不将其转换为指针。
  2. printf 中的%c 格式化程序应该采用char,而不是char *

【讨论】:

    【解决方案2】:

    您正在调用一个在调用点没有原型的函数。 C89 说这是允许的,但您的问题是确保使用与最终定义的参数正确的参数调用函数。由于在这种情况下它们不匹配,因此未定义的行为。

    打开更多编译器警告(在 gcc 的情况下为-Wall)。

    【讨论】:

    • 我得到的输出是 a.?? a[0] 不是指地址吗?
    • @karthik: 正确,a[0] 是一个字符,值为 97。97 可能被解释为一个地址,尽管没有理由认为它是一个有效的地址。行为未定义,因此允许您的实现打印a。由于 %c 格式,调用约定导致以允许 printf 获取该值并将其用作字符的方式传递 97 的值。但是您无权依赖这种情况,这只是您的特定编译器、编译器选项和天气发生的情况。
    【解决方案3】:

    您没有将字符传递给指针。

    fun() 需要一个指向字符的指针,但您正在传递一个字符。这应该会产生语法错误。或者,如果你真的没有声明函数 fun(),至少不能正常工作。

    字符是在赋值时复制的整数类型。

    【讨论】:

    • 这是我所期望的,但 o/p 变成了“a”。我试过 GCC
    • 如果不通过调试器运行它,我无法确定为什么会这样。但是 a[0] 不是指针。 (注意 a + 0 或只是 a 是一个指针。)
    【解决方案4】:

    解决方案 1:不要使用指针。

    void fun(char a);
    

    解决方案 2:如果由于某种原因在这里不明显需要使用指针,请使用 & 获取指针并使用 * 取消引用指针。

    void fun(char *a);
    int main()
    {
        char a[100];
        a[0]='a';
        a[1]='b';
        fun(&a[0]);
    }
    
    void fun(char *a)
    {
        printf("%c",*a);
    }  
    

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多