Off-topi c, но слишком долго для комментария.
Ваша строка scanf
на самом деле неверна (не относится к пробелам), и вам просто повезло, что она работает здесь , Вам нужно удалить амперсанд &
перед text
. То, что у вас есть, передает адрес text
на scanf
, который фактически является указателем на char[10]
. Для scanf(" %s", text);
, text
«распадается» на указатель на его первый элемент (char*
), который вы действительно хотите. Здесь, так уж получилось, что адрес массива (&text
) совпадает с адресом первого элемента в массиве (&(text[0])
или *(text + 0)
), так как они оба в автомате c хранение в том же месте. Например, если бы у вас было что-то вроде
char* text = malloc(10);
scanf(" %s", &text);
, вы бы вызвали неопределенное поведение, перезаписав память, начиная с адреса указателя на вашу malloc
память. Здесь адрес текста - это адрес указателя в автоматическом c хранилище, тогда как память, на которую он фактически указывает, находится где-то еще. Это можно увидеть в следующей программе:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char text[10];
char* text2 = malloc(10);
printf("address of text = %p\n", (void*)(&text)); // same address as below
printf("address of text[0] = %p\n", (void*)(&(text[0]))); // same address as above
printf("address of text2 = %p\n", (void*)&text2); // different than below
printf("address of text2[0] = %p\n", (void*)(&(text2[0]))); // different than above
return 0;
}
&text == &(text[0])
, показывающие, что адрес массива и адрес первого элемента массива эквивалентны, однако &text2 != &(text2[0])
, показывающий адрес указатель не равен адресу первого элемента памяти, который вы malloc
изм.
Иллюстрированный здесь: https://godbolt.org/z/N2TKvK