char *t = malloc(2);
это означает, что вы создали указатель на область памяти, которая может содержать 2 байта
+-+-+
t -> | | |
+-+-+
, когда вы делаете
t = "as";
, теперь вы указали куда-токроме того, на что он первоначально указывал.теперь он больше не указывает на кучу
t = realloc(t,sizeof(char)*6);
теперь вы берете указатель, указывающий на память только для чтения, и пытаетесь перераспределить его.
при использовании malloc вы выделяете пространство в куче,t в данном случае это указатель на это местоположение, адрес, где находится блок.
Для того, чтобы поместить что-то в это место, вам нужно скопировать туда данные путем разыменования t, это делается записью *перед t:
*t = 'a'; // now 'a' is where t points
*(t+1)='s'; // now 's' is behind a, t still pointing to 'a'
однако в C строка всегда заканчивается 0 (значение ASCII), записанным как '\ 0', поэтому для того, чтобы сделать его строкой, необходимо добавить \0
+-+-+--+
t -> |a|s|\0|
+-+-+--+
, чтобы сделать это, вам нужно вместо этого malloc 3 байта, чем вы можете добавить \ 0, написав *(t+2)='\0';
, теперь t можно рассматривать как указывающий настрока и используется в функциях, которые принимают строки в качестве аргументов, например, strlen( t )
возвращает 2