请解释这个奇怪的输出

时间:2009-06-26 12:49:05

标签: c pointers

#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

5 个答案:

答案 0 :(得分:13)

您打印的地址不是值使用

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

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

顺便说一下,一旦打印出来,arr就是一个局部变量,而sizeof也无法知道原始数组的大小,所以应该打印大小为4.下面的代码显示了这种行为,并且区别在于数组和指针,当涉及到sizeof。 如果你试试

编辑:感谢Daniel的评论,将代码更改为我实际测试过的内容,而不是仅仅猜到了

#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

答案 1 :(得分:2)

你的大小等于1,因为sizeof(arr)返回的是arr指向的大小,即一个大小为1的字符。

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

如果要使用char *,则需要在printf中使用%s标志。但是,确保null终止你传递printf的任何东西,否则你会得到垃圾。

答案 2 :(得分:2)

嗯,这里有些不对劲。我不相信这个输出。

  • arrchar *sizeof(char *) != 1
  • '\n'中没有printf

如果您手动输入代码,请不要这样做。复制和粘贴要好得多,所以我们可以确定你没有做任何拼写错误。如上所述,你应该得到像

这样的东西
size is 4char is 0

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

答案 3 :(得分:1)

你试图将它用作字符串和字符(并且你的字符串不是以null结尾)。要将其用作字符串,您可以更改代码:

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

...

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

要将其用作char,您可以像这样更改print语句:

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

答案 4 :(得分:0)

有关C:http://www.macdonald.egate.net/CompSci/hstrings.html

中字符串处理的说明,请参阅此处