Я написал следующий код на C. Мне нужно понять, как операции копирования строк будут выполняться после того, как указатель символа получит назначенную память через malloc()
динамически.Анализ символьного указателя с динамическим распределением памяти
Мой код:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUFFSZ 20
int main()
{
char *name = NULL;
char my_name[BUFFSZ] ;
memset(my_name,0,BUFFSZ);
strcpy(my_name, "vinothkumarsaradavallivaradathirupathi");
printf("string copied is %s\n",my_name);
if ((name = malloc(1 + strlen(my_name)+1)) != NULL)
strcpy(name,my_name);
printf("Name is %s\n",name);
free(name);
name = NULL;
return 0;
}
Фактический выход:
string copied is vinothkumarsaradavallivaradathirupathi
Name is vinothkumarsaradavalliva��
Согласно кодексу, я ожидал, что ниже выход, но получил только один выше. Это будет полезно, если кто-то объяснит это четко.
Ожидаемый результат:
string copied is vinothkumarsaradaval
Name is vinothkumarsaradaval
Когда я запустил этот код в GDB, я получил следующий вывод:
Breakpoint 2, main() at first_pgm.c:12
12 memset(my_name,0,BUFFSZ);
(gdb) n
14 strcpy(my_name, "vinothkumarsaradavallivaradathirupathi");
(gdb) p name
$1 = 0x0
(gdb) p my_name
$2 = '\000' <repeats 19 times>
(gdb) n
Breakpoint 3, main() at first_pgm.c:15
15 printf("string copied is %s\n",my_name);
(gdb) p my_name
$3 = "vinothkumarsaradaval"
(gdb) n
string copied is vinothkumarsaradavallivaradathirupathi
Вот почему "$ 3" и "строка копируется" выходы конфликтуют ?
Вы знаете, что копируете 39 байт в массив из 20 элементов? –
Да, я намеренно запрограммирован на понимание управления памятью –
Почему это поможет вам понять управление памятью? Это просто вызывает поведение undefind, поэтому оно не будет последовательным и, как таковое, не полезно для обучения. –