Объясните странный вывод - PullRequest
0 голосов
/ 12 апреля 2020

Я написал код на C языке,

#include<stdio.h>

int main(void)
{
    char c[]="Suck It Big";
    char *p=c;
    printf("%c\n",p);
    printf("%c\n",p[3]);
    printf("%c\n",++p);
    printf("%d\n",p);
    printf("%d\n",p[3]);
}

Вывод этого кода, который я получаю: Output

Я скопировал странные символы в строке 1 и 3 вывода и вставил их в редактор, получив "DLE". Кто-нибудь может объяснить значение этого.

1 Ответ

1 голос
/ 12 апреля 2020

Все printf() используемые вами вызовы неверны, за исключением второго, поскольку неверен либо относительный аргумент, либо используемый спецификатор преобразования.

Это вызывает Неопределенное поведение :

Цитата из C18, 7.21.6.1/9 - «Функция fprintf»:

" Если спецификация преобразования недопустима, поведение не определено.288) Если есть Аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено."


printf("%c\n",p);

Когда вы пытаетесь напечатать значение объекта, на который указывает указатель , вы должны использовать оператор разыменования (*), предшествующий объекту указателя. В противном случае вы пытаетесь напечатать значение указателя - адрес объекта, на который указывает указатель. И из-за этой операции вы используете неверный спецификатор преобразования %d вместо %p для печати значения указателя.


Исправленная программа:

#include<stdio.h>

int main(void)
{
    char c[]= "Suck It Big";
    char *p = c;
    printf("%c\n", *p);              // Prints the first element of array c.
    printf("%c\n", p[3]);            // Prints the fourth element of array c
    printf("%c\n", *(++p));          // Prints the second element of array c
    printf("%p\n", (void*) p);       // Prints the address held in p / first element of c.
    printf("%p\n", (void*) &p[3]);   // Prints the address of the fourth element of c.
}

Обратите внимание, что приведение к void* необходимо для того, чтобы программа соответствовала стандарту C.

Вывод:

S
k
u
0x7fff1d3a133d  // Address defined by system
0x7fff1d3a1340  // Address defined by system
...