修改参数而不返回

时间:2016-05-13 18:55:06

标签: c

我在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;
}

请帮帮我。 ;)

3 个答案:

答案 0 :(得分:0)

在C中,函数的参数按值传递。 d按值传递给函数testdata是一个功能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()函数知道原始类型是什么。