Преобразование \ приведение пустого указателя к строке - PullRequest
0 голосов
/ 08 декабря 2018

Как мне это сделать, поскольку я не знаю, смогу ли я прочитать указатель void, поэтому сначала я хочу преобразовать его в строку.Вот моя попытка при тестировании:

void* test1;
char test2[] = "ha 21";
char test3[50];

test1 = test2;

test3 = test1;

printf("%s", test3);

return 0;

Когда я пытаюсь сделать test1 = test 2, вероятно, тоже неправильно, но это просто для того, чтобы показать, что должно быть в указателе void.Я только пытаюсь увидеть, как я могу преобразовать пустой указатель, содержащий строку, в строку.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

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() какальтернатива (что делает большинство разработчиков), потому что она может предотвратить переполнение буфера, но помните, что нулевой символ не добавляется в конце назначения неявным образом, если источник длиннее, чем максимальное количество символов, которые будут скопированы из источника.Вы должны четко позаботиться об этом сценарии, когда источник длиннее пункта назначения.

0 голосов
/ 08 декабря 2018

Поскольку test3 является типом массива, его нельзя назначать.В C вы можете преобразовать каждый указатель в void * и обратно (он приведен неявно).

Таким образом, возможное решение - объявить test3 в качестве указателя:

void *test1;
char test2[] = "ha 21";
char *test3;

test1 = test2;
test3 = test1;

printf("%s", test3);

Или, еслиВы хотите скопировать память (как указано в комментариях):

void *test1;
char test2[] = "ha 21";
char test3[50];

test1 = test2;
strcpy(test3, test1);

printf("%s", test3);
...