我将如何执行此操作,因为我不知道是否可以读取void
指针,因此我想先将其转换为字符串。这是我在测试时的尝试:
void* test1;
char test2[] = "ha 21";
char test3[50];
test1 = test2;
test3 = test1;
printf("%s", test3);
return 0;
当我尝试制作test1 = test 2
时也是错误的,但这只是为了显示void
指针中应该包含的内容。我只是想看看如何将包含字符串的空指针转换为字符串。
答案 0 :(得分:1)
由于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);
答案 1 :(得分:0)
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 Standard#6.3.2.3p1
1指向void的指针可以与任何对象类型的指针进行转换。指向任何对象类型的指针都可以转换为void指针,然后再返回;结果应等于原始指针。
问题在于以下语句:
test3 = test1;
test3
是一个数组,不能将test1
分配给test3
,因为在C中,数组名是不可修改的左值。
相反,您应该将test1
的内容复制到test3
,并且可以使用strcpy()
。
但是strcpy()
是不安全的,因为它无法知道目标缓冲区的大小,并且如果目标缓冲区的长度不足以容纳源字符串(包括null终止),则可能会导致缓冲区溢出字符)。在复制字符串之前,如果可以确保目标缓冲区足够长以容纳源字符串(包括空终止符),而不是使用strcpy()
将源字符串复制到目标缓冲区的完美长度。在您的情况下,由于目标缓冲区的大小为50
,足以容纳源字符串"ha 21"
,因此可以安全地使用strcpy()
。因此,代替此:
test3 = test1;
您应该这样做:
strcpy(test3, test1);
其他:
strncpy()
不是strcpy()
的安全版本。
在这里阅读有关why strncpy()
is introduced?
但是,您可以使用strncpy()
作为替代方法(大多数开发人员都这样做),因为它可以防止缓冲区溢出,但是请记住,如果源代码长于目标字符串,则不会在目标末尾隐式附加空字符从源复制的最大字符数。您需要在源比目标长的地方明确处理此方案。