指向常量结构数组作为函数参数的C常量指针
如何通过传递数组指针并在Alt.1中获取请求的数组引用,使Alt.1按预期工作指向常量结构数组作为函数参数的C常量指针,c,arrays,pointers,reference,C,Arrays,Pointers,Reference,如何通过传递数组指针并在Alt.1中获取请求的数组引用,使Alt.1按预期工作 struct mystruct { int id1; int id2; }; const struct mystruct local_struct[] = { {0, 55}, {1, 66}, }; // Alt.1 i like to make this work (not working) int get_reference_1(const struct mystruct *
struct mystruct
{
int id1;
int id2;
};
const struct mystruct local_struct[] = {
{0, 55},
{1, 66},
};
// Alt.1 i like to make this work (not working)
int get_reference_1(const struct mystruct *s){
s = local_struct;
return 0;
}
// Alt.2 works perfect but i like to use the return as status as in Alt.1.
const struct mystruct *get_reference_2(){
return local_struct;
}
int main()
{
struct mystruct *s = NULL;
// Alt.1
if(get_reference_1(s))
/* Expected Fail*/
else
/* Expected Success*/
// Alt.2
s = get_reference_2()
if(!s)
/* Expected Fail*/
else
/* Expected Success*/
return 0;
}
也许我想错了,我需要传双分球
编辑:用“const”更正。
Edit2:更新的标题。
s=local\u struct代码>正在更改局部变量-它不会更改main中的变量。传递变量的地址,并对原始变量进行更改,取消引用该变量
int get_reference_1(struct mystruct **s){
*s = local_struct;
return 0;
}
打电话是
if(get_reference_1(&s))
/* Expected Fail*/
else
/* Expected Success*/
另外,将const
变量分配给非const变量也会使编译器抱怨。这里的local_struct
是在代码中声明的常量struct
。解决方案检查您是否做了正确的事情-此任务是否必要?您还可以根据需要添加const
限定符:
int get_reference_1(const struct mystruct **s){
*s = local_struct;
return 0;
}
...
const struct mystruct *s = NULL;
在最坏的情况下,删除常量
限定符。s=local\u结构代码>正在更改局部变量-它不会更改main中的变量。传递变量的地址,并对原始变量进行更改,取消引用该变量
int get_reference_1(struct mystruct **s){
*s = local_struct;
return 0;
}
打电话是
if(get_reference_1(&s))
/* Expected Fail*/
else
/* Expected Success*/
另外,将const
变量分配给非const变量也会使编译器抱怨。这里的local_struct
是在代码中声明的常量struct
。解决方案检查您是否做了正确的事情-此任务是否必要?您还可以根据需要添加const
限定符:
int get_reference_1(const struct mystruct **s){
*s = local_struct;
return 0;
}
...
const struct mystruct *s = NULL;
在最坏的情况下,删除常量
限定符。在这里,您可以随心所欲
struct mystruct
{
int id1;
int id2;
};
struct mystruct local_struct[] = {
{0, 55},
{1, 66},
};
// Alt.1 i like to make this work (not working)
int get_reference_1(struct mystruct **s){
*s = local_struct;
return 0;
}
// Alt.2 works perfect but i like to use the return as status as in Alt.1.
struct mystruct *get_reference_2(){
return local_struct;
}
int main()
{
struct mystruct *s = NULL;
// Alt.1
if(get_reference_1(&s))
{
/* Expected Fail*/
}
else
{
/* Expected Success*/
}
// Alt.2
s = get_reference_2();
if(!s)
{
/* Expected Fail*/
}
else
{
/* Expected Success*/
}
return 0;
}
它将成功执行。这是您想要的
struct mystruct
{
int id1;
int id2;
};
struct mystruct local_struct[] = {
{0, 55},
{1, 66},
};
// Alt.1 i like to make this work (not working)
int get_reference_1(struct mystruct **s){
*s = local_struct;
return 0;
}
// Alt.2 works perfect but i like to use the return as status as in Alt.1.
struct mystruct *get_reference_2(){
return local_struct;
}
int main()
{
struct mystruct *s = NULL;
// Alt.1
if(get_reference_1(&s))
{
/* Expected Fail*/
}
else
{
/* Expected Success*/
}
// Alt.2
s = get_reference_2();
if(!s)
{
/* Expected Fail*/
}
else
{
/* Expected Success*/
}
return 0;
}
它将成功执行。有许多重复项。显然,您仍然不太了解指针是如何工作的,请阅读更多关于它的内容。它不起作用的原因是s
是get\u refereec\u 1
的本地对象。您必须传递指向要更新的poitner的指针。为什么要调用全局结构“local\u struct
”?你想迷惑敌人吗?@IharobAlAsimi:更新为const@EugeneSh。这只是我问题的一个简短例子。我在一个更大的系统里工作,我不能包罗一切。很抱歉搞混了。有很多重复的。显然,您仍然不太了解指针是如何工作的,请阅读更多关于它的内容。它不起作用的原因是s
是get\u refereec\u 1
的本地对象。您必须传递指向要更新的poitner的指针。为什么要调用全局结构“local\u struct
”?你想迷惑敌人吗?@IharobAlAsimi:更新为const@EugeneSh。这只是我问题的一个简短例子。我在一个更大的系统里工作,我不能包罗一切。抱歉搞混了。现在我的网很糟糕。我的编辑速度很慢。。很抱歉。@dasblinkenlight.:const struct mystruct*a
基本上是说a
是指向const的指针。修改结构的值将是非法的。但是指针是自由的。我们可以在任何地方指出这一点。所以我们只能读这个指针。如果我们想通过修改结构实例的某个成员来创建链接节点,那么它会抱怨。(通过p
我们将访问它)。感谢您的编辑。由于OP的local_struct
标记为const
,我们别无选择,只能生成指向它的const
指针。否则,我们可能会通过指向它的指针意外地修改local_struct
,从而导致未定义的行为。保持s
可修改的唯一方法是从local\u struct
@dasblinkenlight中删除const
。正确的说法是指向const struct的指针吗?我只是在努力写得更清楚。@dasblinkenlight,目的是为了避免修改,因此是常量。现在我的网络很糟糕。我的编辑速度很慢。。很抱歉。@dasblinkenlight.:const struct mystruct*a
基本上是说a
是指向const的指针。修改结构的值将是非法的。但是指针是自由的。我们可以在任何地方指出这一点。所以我们只能读这个指针。如果我们想通过修改结构实例的某个成员来创建链接节点,那么它会抱怨。(通过p
我们将访问它)。感谢您的编辑。由于OP的local_struct
标记为const
,我们别无选择,只能生成指向它的const
指针。否则,我们可能会通过指向它的指针意外地修改local_struct
,从而导致未定义的行为。保持s
可修改的唯一方法是从local\u struct
@dasblinkenlight中删除const
。正确的说法是指向const struct的指针吗?我只是想写得更清楚一些。@dasblinkenlight,目的是为了避免修改,因此是const。谢谢你的快速回复,这个回复和之前的建议回复一样有效。谢谢你的快速回复,这个回复和之前的建议回复一样有效。