函数内部的C指针赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数内部的C指针赋值相关的知识,希望对你有一定的参考价值。

我试图在函数get_by_id中分配一个指向数组元素的指针。

函数get_by_id正确地找到元素并将元素分配给lp,但是当它返回到调用者(set_attr)时,它将恢复为NULL

我不明白为什么它会在调用者中恢复到NULL,更不用说如何修复它了。

#include <stdio.h>
#include <stdlib.h>


typedef struct
{
    int id;
    char name[128];
    int attr;
} Lookup;


static int num_sources = 0;

Lookup ltable[128];


void add(int id, const char *name)
{
    sprintf(ltable[num_sources].name, name);
    ltable[num_sources].id = id;
    ltable[num_sources].attr = 999;  // example default attr 999
    num_sources++; // increment the number of sources
}


int get_by_id(int id, Lookup *lp)
{
    int status = 1;
    for (int i = 0; i < 128; i++)
    {
        lp = &ltable[i];
        if (id == lp->id)
        {
            status = 0;
            break;
        }
    }
    return status;
}


int set_attr(const int id, const int attr)
{
    Lookup *lp = NULL;
    int status = get_by_id(id, lp);
    if (status == 0)
    {
        lp->attr = attr;
    }
    return status;
}

int main(void) {
    add(88, "main"); // example id 88
    set_attr(88, 9); // example attr 9
    return EXIT_SUCCESS;
}
答案

要更改lp的值,您必须使用双指针:

int get_by_id(int id, Lookup **lp)
{
    int status = 1;
    for (int i = 0; i < 128; i++)
    {
        *lp = &ltable[i];
        if (id == (*lp)->id)
        {
            status = 0;
            break;
        }
    }
    return status;
}

并打电话给:

    int status = get_by_id(id, &lp);

因为C是“按值传递”,所以制作了lp的副本并将其传递给函数。调用者无法看到对该副本的任何更改。要允许被调用函数更改调用者的变量,可以传递调用者变量的地址,以便被调用函数可以更改它。在您的情况下,您传递lp的地址写为&lp


The following version may be peferred:
#define T_SIZE (sizeof(ltable)/sizeof(ltable[0]))

Lookup *get_by_id(int id)
{
    for (int i = 0; i < T_SIZE; i++)
        if (id == ltable[i].id)
            return &ltable[i];

    return 0;
}

请注意,它返回指向表条目的指针,如果未找到则返回零。

另一答案

您需要通过引用而不是值传递Lookup参数。这是因为只有在通过引用传递时才能修改parameter

int get_by_id(int id, Lookup *lp)
{
    int status = 1;
    for (int i = 0; i < 128; i++)
    {
        *lp = ltable[i];
        if (id == lp->id)
        {
            status = 0;
            printf("lp=%X
", lp);
            break;
        }
    }
    return status;
}

int set_attr(const int id, const int attr)
{
    Lookup lp = {0};
    int status = get_by_id(id, &lp);
    if (status == 0)
    {
        printf("lp = %X
", &lp);
        lp.attr = attr;
    }
    return status;
}

这应该工作。

以上是关于函数内部的C指针赋值的主要内容,如果未能解决你的问题,请参考以下文章

C 语言二级指针作为输出 ( 指针输入 | 指针输出 | 二级指针 作为 函数形参 使用示例 )

C 语言多级指针 ( 在函数中生成 二级指针 | 通过传入的 三级指针 进行间接赋值 )

C 语言指针间接赋值 ( 直接赋值 和 间接赋值 | 在子函数中间接赋值 )

函数中的 C 指针赋值

C 语言字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )(代码

c语言如何给结构体指针赋值?