转换\将空指针转换为字符串

时间:2018-12-07 23:56:58

标签: c string void-pointers

我将如何执行此操作,因为我不知道是否可以读取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 :(得分: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()作为替代方法(大多数开发人员都这样做),因为它可以防止缓冲区溢出,但是请记住,如果源代码长于目标字符串,则不会在目标末尾隐式附加空字符从源复制的最大字符数。您需要在源比目标长的地方明确处理此方案。