Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 修改参数而不返回_C - Fatal编程技术网

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) {

我在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) {
    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
指向字符串literal
toto
,而
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;
}