When I try to make test1 = test2 is probably wrong as well but that is just to show what should be in the void pointer.
test1 = test2
совершенно верно.Из стандарта C # 6.3.2.3p1
1 Указатель на void может быть преобразован в или из указателя на любой тип объекта.Указатель на любой тип объекта может быть преобразован в указатель на void и обратно;результат должен сравниться с исходным указателем.
Проблема в следующем утверждении:
test3 = test1;
test3
- массив, и вы не можете присвоить test1
test3
потому что в C имена массивов не являются изменяемыми lvalues.
Вместо этого вам следует скопировать содержимое test1
в test3
, и вы можете использовать strcpy()
для этого.
Но strcpy()
небезопасно, потому что у него нет способа узнать, насколько велик целевой буфер, и вы можете получить переполнение буфера, если буфер назначения не достаточно длинный, чтобы содержать исходную строку (включая нулевой завершающий символ).Перед копированием строки, если вы можете убедиться, что буфер назначения достаточно длинный, чтобы содержать исходную строку (включая завершающий символ NULL), то это прекрасно, если использовать strcpy()
для копирования исходной строки в буфер назначения.В вашем случае, поскольку размер буфера назначения равен 50
, что достаточно для хранения строки источника "ha 21"
, вы можете смело использовать strcpy()
.Итак, вместо этого:
test3 = test1;
Вы должны сделать:
strcpy(test3, test1);
Дополнительно:
strncpy()
не более безопасная версия strcpy()
.
Читайте здесь о , почему вводится strncpy()
?
Однако вы можете использовать strncpy()
какальтернатива (что делает большинство разработчиков), потому что она может предотвратить переполнение буфера, но помните, что нулевой символ не добавляется в конце назначения неявным образом, если источник длиннее, чем максимальное количество символов, которые будут скопированы из источника.Вы должны четко позаботиться об этом сценарии, когда источник длиннее пункта назначения.