指定const函数arguement指针的指针

时间:2016-05-05 10:28:41

标签: c pointers

假设我有一个指向数组的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 *'

谢谢

4 个答案:

答案 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;
}

正如其他人所指出的,不要这样做:)