Пожалуйста, объясните этот странный вывод - PullRequest
2 голосов
/ 26 июня 2009
#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 ]

13 голосов
/ 26 июня 2009

Вы печатаете адрес не значение

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

Попробуйте выполнить это через отладчик, чтобы понять, что происходит, и, пожалуйста, задайте реальный вопрос, например, что, по вашему мнению, должно произойти, и что вы наблюдаете вместо этого. Делая это, вы, вероятно, ответите себе на большинство вопросов.

Кстати, после печати arr является локальной переменной, а sizeof не позволяет узнать размер исходного массива, поэтому он должен иметь размер печати 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
2 голосов
/ 26 июня 2009

Хм, здесь что-то не так. Я не верю этому выводу.

  • arr - это char * и sizeof(char *) != 1.
  • Нет '\n' s в ваших printf s.

Если вы ввели код вручную, не делайте этого. Копирование и вставка намного лучше, поэтому мы можем быть уверены, что вы не делали опечаток. Как написано, вы должны были получить что-то вроде

size is 4char is 0

(Часть "char is" может печатать любой случайный символ.)

2 голосов
/ 26 июня 2009

Вы получили размер, равный 1, потому что sizeof (arr) возвращает размер, на который указывает arr, символ, который равен размеру 1.

Вы получили 'e', ​​потому что printf был присвоен символ * вместо символа, когда был задан флаг% c. Измените его на printf ("Char is:% c", * arr).

Если вы хотите использовать символ *, вам нужно использовать флаг% s в printf. Но также убедитесь, что все, что вы передаете printf, завершается нулем, иначе вы получите мусор.

1 голос
/ 26 июня 2009

Вы пытаетесь использовать это как строку и как символ (и ваша строка не заканчивается нулем). Чтобы использовать его как строку, вы должны изменить код следующим образом:

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

...

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

Чтобы использовать его как символ, вы должны изменить свой оператор печати следующим образом:

printf("char is %c", arr[0]);
0 голосов
/ 26 июня 2009

Смотрите здесь для объяснения обработки строки в C: http://www.macdonald.egate.net/CompSci/hstrings.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...