函数内部的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指针赋值的主要内容,如果未能解决你的问题,请参考以下文章