Вы не получаете местоположение, вы получаете случайное число, полученное из вашей памяти.
char h
- это один символ.
char[]
или char*
- это символадрес (ячейка памяти) начала последовательности символов, один за другим.
%s
ожидает, что вы дадите ему char*
.
Вы даете ему h
, один char
.
Итак, что делает компьютер (по историческим причинам), так это то, что он позволяет вам избежать неприятностей, даже если он ошибочен (это предупреждение действительно должно быть ошибкой).Отказ от этого означает, что он принимает значение ASCII символа, хранящегося в h (и в зависимости от того, находитесь ли вы в 32-разрядной или 64-разрядной системе, несколько случайных байтов, следующих за этим символом в памяти), поэтому случайное число,и интерпретирует его как адрес памяти диапазона символов (a char*
), и пытается напечатать это.
Во что бы то ни стало, это должно произойти сбой, но вам «повезло» в том числе, что выв конечном итоге кажется, что в вашей программе действительный адрес памяти, поэтому вы печатаете несколько случайных символов.
То, что вы должны сделать, выглядит примерно так:
#include <stdio.h>
void main(){
char c[] = "Hello";
char h = c[4];
printf("%c",h); // Change %s to %c, which is for char, not char*
}
или поочередно:
#include <stdio.h>
void main(){
char c[] = "Hello";
char h[2] = { 0, 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
h[0] = c[4];
printf("%s",h);
}
Если ваш компилятор достаточно новый, вы могли бы даже написать:
#include <stdio.h>
void main(){
char c[] = "Hello";
char h[2] = { c[4], 0 }; // Make sure you have an extra "0" at the end that indicates the end of the string.
printf("%s",h);
}
для последнего варианта, но большинство старых компиляторов не могут этого понять (опять жепо историческим причинам).