【问题标题】:Pointer is null after returning from function call从函数调用返回后指针为空
【发布时间】:2013-10-14 16:05:23
【问题描述】:

首先,我知道这应该在 SO 的某个地方得到回答,但我似乎找不到正确的帖子。因此,如果它是重复的,请指向我回答这个问题的帖子,我将删除它。

我有一个复制字符串的函数:

static int read_ad_content(json_t * root, char* content)
{

  [.. stuff happens]

  const char* tmp = json_string_value(json_content);
  unsigned int size = strlen(tmp);
  content = (char*)malloc(size + 1);
  memcpy(content, tmp, size);
  content[size] = '\0'; // <= I checked and content is NOT null here!

  return 0;
}

我在我的主函数中这样称呼它:

char *ad_content;
if (read_ad_content(ad_json, ad_content) != 0)
  {
     log_err(argv, "Failed to extract information");
  }

  if (ad_content == NULL)
  {
    // <= I always end up here
  }

我知道这应该很容易,但我就是不知道如何解决。

【问题讨论】:

  • 你修改了一份指针。调用方的ad_content 永远不会被触及。
  • 引用语义不是这样工作的。例如。 see here,或者考虑一下。
  • 这是我昨天回答的非常相似的问题。HERE

标签: c pointers


【解决方案1】:

在 C 中,参数是按值传递的。你所做的与以下没有任何不同:

void brokenMethod(int a){
    a = 10;
}

int a = 0;
brokenMethod(a);
if(a == 0)
{
    //always end up here!
}

当然,你总是会在那里结束。 a 从未修改过! a 的值被传递给了 brokenMethod,它可以做任何它想做的事情,但这不会影响你外部范围内的 a 的值。

如果我想让该方法填充一个 int,我必须给它传递一个指向 int 的指针。

void fixedMethod(int* a)
{
    *a = 10; 
    //Remember, you want to modify the thing being pointed at, not the thing doing the pointing!
    //a = something; is going to have the exact same problem as the first example
}

int a = 0;
fixedMethod(&a);
if(a == 0)
{
    //Better
}

上面的例子将一个值粘贴到一个 int 中。在您的情况下,如果您希望该方法填充指向 int 的指针,那么您必须将指针传递给指向 int 的指针。

侧边栏: 您可能还会发现通过参数返回值的方法难以推理并且更可能包含错误。如果你想返回一个指向 int 的指针,只需要一个返回指向 int 的指针的方法。

int* HonestMethod()
{
    return pointer to whatever.
}

【讨论】:

  • 我不返回指针的原因是我想要一种检查错误的方法。当然有人可能会争辩说,只要我返回 null,就一定会发生错误。我想我会尝试使用你的方法。
  • 对,如果您需要一个函数来设置指针并且指示错误,那么-除非您为此目的设置了一个结构,这通常很奇怪-至少其中一项必须通过参数进行修改,因为 C 中的函数只能返回一个值。
  • 你是绝对正确的。您有几个选择:返回一个包含返回值和某种错误指示符的对象,或者返回 null 作为错误指示。无论您做什么,请确保该函数的文档对其进行了解释。如果您想返回 NULL 作为错误指示符,那么文档应该说“如果发生错误,则返回 NULL”
  • @PaulGriffiths 我发现,根据我的经验,人们很少会费心去检查错误代码,而只是等待空引用爆炸。鉴于此,我选择推动人们编写更易于阅读的方法,而不是每个人都忽略的错误检查。
猜你喜欢
  • 1970-01-01
  • 2017-03-25
  • 2021-07-14
  • 1970-01-01
  • 2016-04-24
  • 2016-01-22
  • 2019-08-22
  • 1970-01-01
  • 2011-12-06
相关资源
最近更新 更多