假设我有一个指向数组的const指针作为函数参数,如下所示:
int* test(const int* inputArg)
在函数中我想将inputArg指定为结构的一个成员,如下所示:
typedef struct {
int * intArray;
} structSample;
structSample abc;
abc.intArray = inputArg;
我应该如何投射inputArg来实现这一目标?现在,如果我编译它,将显示错误
error: assigning to 'int *' from 'const int *'
谢谢
答案 0 :(得分:4)
首先,你没有
指向数组的const指针
你所拥有的是一个指向常量整数的指针。如果你真的想要一个指向整数的常量指针作为参数,你必须将原型声明如下:
int* test(int* const inputArg)
当然,除非另有想法。
评论更新:
所以基本上如果你想要一个指向函数存储在你的函数中的常量int的指针作为结构成员,你可以像这样声明它:
struct SampleStruct
{
const int* a;
/* whatever follows */
};
int* test(const int* inputArg)
{
struct SampleStruct ss;
ss.a = inputArg;
/* other code */
}
你必须意识到,在这样做时,你必须是正确的。这意味着,由于(参数和字段)都是指向常量整数的指针,因此不得更改该地址的值。
答案 1 :(得分:2)
abc.intArray = (int*)inputArg;
这是C-style cast
。一方面,编译器默认情况下不允许进行const转换,因为这样做很危险。您将删除const,风险自负。
例如,如果您的test
被称为
const int max = 100;
//centuries later
test(&max);
你会继续演员:
abc.intArray = (int*)inputArg;
// after another century later
*(abc.intArray) = 10; // kaboom. Undefined behavior. Debugging is a nightmare at this point
答案 2 :(得分:1)
这里最好的解决方案是将功能改为
int* test(int* inputArg)
{
/* do whatever you wish to do with inputArg itself
* why bother to create a structure and all?
* The whole purpose you wanted the const int* inputArg
* was to prevent any accidental change of data pointed to by it
* Wasn't it?
*/
}
答案 3 :(得分:1)
看起来你正在使用Werror
标志(这不应该是错误而是警告)
有一种方法可以在没有警告的情况下欺骗编译器(使用联合):
#include <stdio.h>
int *test(const int *inputArg)
{
union {int *nonconstant; const int *constant;} fake = {.constant = inputArg};
int *p = fake.nonconstant;
return p;
}
int main(void)
{
const int x = 500;
int *p = test(&x);
*p = 100; /* Boom */
return 0;
}
正如其他人所指出的,不要这样做:)