【问题标题】:Please explain this strange output请解释这个奇怪的输出
【发布时间】:2009-06-26 12:49:05
【问题描述】:
#include<stdio.h>
#include<conio.h>

void print(char *arr);

void main()
{
    clrscr();

    char temp='r';
    print(&temp);
    getch();
}

void print(char *arr)
{
    int arrsz=sizeof(arr);
    printf("size is %d",sizeof(arr));
    printf("char is %c",arr);
}

为什么我会得到这个输出?

size is 1
char is e

应该是char is r

【问题讨论】:

  • 另外,请不要发布带有一系列 ! 的问题。
  • 我是如何得到这个输出的。我不知道
  • 是的,我会纠正它丹尼尔....
  • 这是CHAN的第二个问题——不要对他刻薄。也许他没有注意到,这不是留言板。陈,请阅读stackoverflow.com/aboutstackoverflow.com/faq。如果您想要成熟的答案,请发布成熟的问题。
  • 对我来说,它应该说“大小为 4”。你确定你得到“size is 1”吗?

标签: c pointers


【解决方案1】:

您打印的是地址而不是使用的值

printf("char is %c",*arr);

尝试通过调试器运行它以了解会发生什么,并请提出一个真实的问题,例如您认为应该发生什么,以及您观察到什么。通过这样做,您可能会回答自己的大部分问题。

顺便说一句,一旦在打印中,arr 是一个局部变量,而 sizeof 无法知道原始数组的大小,所以它应该打印 size 为 4。下面的代码显示了这种行为,和涉及到 sizeof 时的数组和指针。 如果你尝试

编辑:感谢丹尼尔的评论,将代码更改为我实际测试过的东西,而不是只是猜测

#include <stdio.h>

void print(char *);

int main(int argc, char ** argv)
{
    char temp = 'r';
    char temp2[] = {'a','b'};
    char temp3[] = {'r'};

    print(&temp);
    print(temp2);
    print(temp3);

    printf("sizeof temp is %d\n",sizeof(&temp));
    printf("sizeof temp2 is %d\n", sizeof(temp2));
    printf("sizeof temp3 is %d\n",sizeof(temp3));
    return 0;
}

void print(char * arr)
{
    printf("size of arr is %d\n", sizeof(arr));
    printf("arr contains %c\n", *arr);   
}

你得到:

size of arr is 4
arr contains r
size of arr is 4
arr contains a
size of arr is 4
arr contains r
sizeof temp is 4
sizeof temp2 is 2
sizeof temp3 is 1

【讨论】:

  • 是的,很好的答案。详细地说,@Chan,使类型相同总是好的,所以如果你首先有一个名为 temp 的 char,你将它作为 &temp 传递,所以你现在有一个 char *,你检查函数签名,太好了,它也是一个 char *,那么你正在打印一个 char 的值,所以如果你想让它更清楚,你只需执行 char this_is_a_char = *arr;你又得到了一个字符。查看代码时,“遵循”变量类型总是好的。
  • sizeof(arr) 取决于架构,但通常为 4(指针大小)。不太确定 CHAN 是如何得到 '1' 的输出的,一些编译器是否将 sizeof() 重载到类似于 strlen() 的 char* 的东西?
  • 这段代码是错误的:main() 必须返回 int,sizeof 返回 size_t,而不是 int,指针应该使用 %p 打印(并且只能保证使用 void*)。 clrscr() 和 getch() 也无缘无故地使代码不可移植,并且 print() 的参数应该是一个 const 指针。
  • 你是对的!它应该是 for,除非 sizeof 知道数组的大小,因为它是 const 数据?
  • @Bastien:另外,我确定 main 必须在 C++ 中返回 int,但我不太确定在 C 中是否如此,这是问题的语言。这个链接说不是这样:homepages.tesco.net/J.deBoynePollard/FGA/…
【解决方案2】:

你得到的大小等于 1,因为 sizeof(arr) 正在返回 arr 指向的字符的大小,即大小为 1 的字符。

你得到了'e',因为当给出 %c 标志时 printf 被赋予了一个 char* 而不是一个 char。将其更改为 printf("Char is: %c", *arr).

如果要使用 char*,则需要在 printf 中使用 %s 标志。但是,请确保您通过 printf 的任何内容都为 null 终止,否则您将得到垃圾。

【讨论】:

  • 您对结果“1”的解释不正确。在函数内部,'arr' 是一个字符指针(不是数组),并且会返回与任何其他指针相同的值(通常是 4 或 8,而不是 1)。
  • 我想知道为什么它实际上没有返回 4。我提出这个解释的唯一原因是因为最初的海报说这些是他的结果......
【解决方案3】:

嗯,这里有问题。我不相信这个输出。

  • arrchar *sizeof(char *) != 1
  • 您的printfs 中没有'\n's。

如果您手动输入代码,请不要这样做。复制和粘贴要好得多,因此我们可以确定您没有打错任何字。正如所写,你应该得到类似的东西

size is 4char is 0

(“char is”部分可以打印任意随机字符。)

【讨论】:

  • 1 也让我很困惑。我相信在 Crays 上,CHAR_BITS 曾经是 32,所以 sizeof(char) == sizeof(short) == sizeof(int) == 1。但这不太可能是这里的平台; 和 void main() 大喊 Windows。
  • 这个大小为 1 令人费解。如果我将 temp 作为全局数据,我仍然会在 print() 的输出中得到 4。我见过奇怪的 sizeof 行为,但它是在奇怪的平台上 :)
【解决方案4】:

您正在尝试将其用作字符串和字符(并且您的字符串不是以空值结尾的)。要将其用作字符串,您可以像这样更改代码:

//char temp='r';
char* temp = "r";

...

//printf("char is %c",arr);
printf("char is %s",arr);

要将其用作字符,您可以像这样更改您的打印语句:

printf("char is %c", arr[0]);

【讨论】:

    【解决方案5】:

    请参阅此处了解 C 中字符串处理的说明:http://www.macdonald.egate.net/CompSci/hstrings.html

    【讨论】:

      猜你喜欢
      • 2013-01-10
      • 2020-07-24
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 2016-08-04
      • 1970-01-01
      相关资源
      最近更新 更多