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

C 从函数调用返回后,指针为空,c,pointers,C,Pointers,首先,我知道这个问题应该在某处得到解答,但我似乎找不到正确的帖子。因此,如果它是一个重复的请指向我的职位,回答这个问题,我会删除这个 我有一个复制字符串的函数: 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);

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

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

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;
}
static int read_ad_内容(json_t*root,char*content)
{
[…事情发生了]
const char*tmp=json_字符串_值(json_内容);
无符号整数大小=strlen(tmp);
内容=(字符*)malloc(大小+1);
memcpy(内容、tmp、大小);

content[size]='\0';//在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* HonestMethod()
{
    return pointer to whatever.
}
上面的示例将一个值粘贴到int中。在您的示例中,如果希望该方法填充指向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* HonestMethod()
{
    return pointer to whatever.
}
侧栏: 您还可能发现,通过参数返回值的方法很难推理,而且更可能包含bug。如果您试图返回指向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* HonestMethod()
{
    return pointer to whatever.
}

你修改了指针的副本。
ad_内容
在调用端从未被触及。这不是引用语义的工作方式。例如,或者只是想一想。这是我昨天回答的一个非常类似的问题。我不返回指针的原因是我想有一种检查错误的方法。当然,有人可能会认为只要我返回null,就一定发生了错误。我想我会尝试使用你的方法来做。对,如果你需要一个函数来设置指针并指示错误,那么-除非你为此目的设置了一个结构,这通常很奇怪-至少其中一个必须通过参数修改,因为C中的函数只能返回n一个值。您完全正确。您有几个选项:返回一个包含返回值和某种错误指示器的对象,或者返回null作为错误指示。无论您做什么,请确保函数的文档对此进行了解释。如果您想返回null作为错误指示,那么文档应说明“如果发生错误,则返回NULL”@PaulGriffiths根据我的经验,人们很少在错误代码出现时检查错误代码,只是等待NULL引用爆炸。鉴于此,我选择推动人们编写更易于阅读的方法,而不是每个人都忽略的错误检查方法。