函数内部的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 = <able[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 = <able[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 <able[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 语言字符串模型 ( strstr-while 模型 | 抽象函数模型 | 业务子函数接口定义要点 | 形参指针间接赋值 | 返回值状态 | 形参指针处理 | 形参指针判空 | 形参返回值 )(代码