C 修改参数而不返回
我在C中遇到问题。我有以下功能:C 修改参数而不返回,c,C,我在C中遇到问题。我有以下功能: int test(void *data); 我想用这个函数更改数据,但我不想要另一个原型(不要使用void**)。实际上,这个函数中的数据等于null #include <stdio.h> #include <stdlib.h> int test(void *data) { data = "toto"; return 1; } int main() { void *d; if (test(d) != 1) {
int test(void *data);
我想用这个函数更改数据,但我不想要另一个原型(不要使用void**)。实际上,这个函数中的数据等于null
#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;
}
#包括
#包括
int
测试(无效*数据)
{
data=“toto”;
返回1;
}
int
main()
{
无效*d;
如果(测试(d)!=1){
printf(“erreur\n”);
}
printf(“résultat:%s\n”,(char*)d);//显示“résultat:(null)”
返回0;
}
请帮帮我 在C中,函数的参数是按值传递的<代码>d通过值传递给函数
测试
<代码>数据是函数测试
的局部变量,d
被复制到数据
。任务
data = "toto";
使指针data
指向字符串literaltoto
,而d
不受main
函数中此赋值的影响。因此,此赋值对d
没有影响
在main
中,您正在取消对未初始化指针的引用。这将导致未定义的行为 在测试函数中,更改数据,这不会影响d,因为数据只是一个局部变量。如果您确实需要更改d,那么您需要让test返回数据并执行d=test(d)
此外,在测试函数中,从不使用数据值。那么,将数据作为函数的参数有什么意义呢
在printf中(“结果:%s\n”,(char*)d);,您尝试将d转换为指向char的指针,然后打印d的值。虽然没有取消引用d,但仍在打印尚未初始化的变量,这是未定义的行为。任何对象指针(即非函数指针)都可以转换为void*
并返回原始类型,而无需更改值。这意味着您可以将任何类型的(对象)指针传递给test()
函数,它将自动转换为void*
,然后您可以将其转换回test()
中
#包括
int测试(无效*数据)
{
字符**s=数据;
*s=“toto”;
返回1;
}
int main()
{
字符*res;
如果(测试和恢复)!=1){
printf(“erreur\n”);
}
printf(“结果:%s\n”,res);
返回0;
}
您只需确保
test()
函数知道原始类型是什么。谢谢。如果不使用int-test(void**data)或void*test(),我可以避免这种情况吗?可以。这就是避免此问题的方法。我想知道为什么要避免使用test(void**data)
。您的问题的答案是“是的,但这是一个非常糟糕的做法”,因为它会非常混乱并且容易出错。void*
可以包含任何对象指针。包括指向另一个指针的指针。所以void**
是完全没有必要的,因为void*
可以表示void*
、void**
、void*******
、int*******
或任何其他类型的对象指针。
#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;
}