从函数调用返回后,指针为空

时间:2013-10-07 22:16:41

标签: c pointers

首先,我知道这应该在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
  }

我知道这应该很容易,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:3)

在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.
}