13
является десятичным для возврата каретки ASCII - когда вы делаете *ptr_i = 13;
, вы устанавливаете b
на 13. Если вы измените свой отпечаток так, чтобы он выглядел как:
printf("char b = %c (%d), int a = %d int c = %d", inst.b, inst.b, inst.a, inst.c);
Вы увидите, что вы получите:
(13), int a = 1 int c = 1606416024
вместо вывода. Символ возврата каретки приводит к тому, что ваш вывод char b
перезаписывается выводом после символа возврата каретки. Это может быть более очевидно, если вы использовали другое число, отличное от 13. Например, используя 86, вы получите:
char b = V, int a = 1 int c = 1606416024
в качестве вывода. Причина a
и c
не имеет смысла в том, что они неинициализированы.
Вы не можете просто ввести структурный указатель на указатель другого типа и ожидать, что компилятор извлечет для вас указатель на поле внутри этой структуры - это не так, как это работает. Я думаю, что вы, возможно, пытались сделать это:
ptr_ch = &ptr_test->b;
ptr_i = &ptr_test->a;
Вот полный пример программы, которая делает то, что я думаю, вы пытаетесь:
#include<stdio.h>
struct test {
char b;
int a;
int c;
};
int main(void)
{
struct test inst = {0, 0, 0};
struct test *ptr_test = &inst;
char *ptr_ch;
int *ptr_i;
ptr_ch = &ptr_test->b;
ptr_i = &ptr_test->a;
*ptr_ch = 'b';
*ptr_i = 86;
printf("char b = %c, int a = %d int c = %d\n", inst.b, inst.a, inst.c);
return 0;
}
И его вывод:
char b = b, int a = 86 int c = 0