我在C中遇到问题。我有这个功能:
int test(void *data);
我想用这个函数更改数据,但我不想要另一个原型(不使用void **)。实际上,数据等于此功能。
#include <stdio.h>
#include <stdlib.h>
int
test(void *data)
{
data = "toto";
return 1;
}
int
main()
{
void *d;
if (test(d) != 1) {
printf("erreur\n");
}
printf("résultat : %s\n", (char *) d); // displays "résultat : (null)"
return 0;
}
请帮帮我。 ;)
答案 0 :(得分:0)
在C中,函数的参数按值传递。 d
按值传递给函数test
。 data
是一个功能test
的局部变量,d
被复制到data
。作业
data = "toto";
使指针data
指向字符串文字toto
,而d
不受main
函数中此指定的影响。因此,此分配对d
没有影响。
在main
中,您正在取消引用未初始化的指针。这将导致未定义的行为。
答案 1 :(得分:0)
在测试功能中,您更改数据,这不会影响 d ,因为数据只是一个局部变量。如果您确实需要更改 d ,那么您需要让测试返回数据并执行 d = test(d)
此外,在 test 函数中,永远不会使用 data 的值。那么将数据作为函数的参数是什么意思?
在 printf(“résultat:%s \ n”,(char *)d); 中,您尝试将 d 转换为指向char的指针,然后打印值 d 。虽然您没有取消引用 d ,但您仍然在打印尚未初始化的变量,这是未定义的行为。
答案 2 :(得分:0)
任何对象指针(即非函数指针)都可以转换为void *
并返回原始类型而不会更改值。这意味着您可以将任何类型的(对象)指针传递给test()
函数,它会自动转换为void *
,然后您可以将其转换回test()
。< / p>
#include <stdio.h>
int test(void *data)
{
char **s = data;
*s = "toto";
return 1;
}
int main()
{
char *res;
if (test(&res) != 1) {
printf("erreur\n");
}
printf("résultat : %s\n", res);
return 0;
}
您只需要确保test()
函数知道原始类型是什么。