初始化指向const指针的指针

时间:2017-06-16 11:13:42

标签: c pointers dynamic struct

我可以在C中尝试做什么?

#include <stdio.h>
#include <stdlib.h>

struct foo{
    int const * const a;    // constPtrToConst is a constant (pointer)
                            // as is *constPtrToConst (value)
};

struct faa{
    int b;
};

int main(void){
    struct foo *x = (struct foo*)malloc(sizeof(struct foo));
    struct faa *y = (struct faa*)malloc(sizeof(struct faa));

    x->a = &(y->b);     // error: assignment of read-only member ‘a’ [that's ok] 
                        // (I)
    x->a++;    // It should not do this either...

    printf("%d,\t%p\n", *(x->a), x->a);    // (II)
    free(x);
    free(y);
}

我如何初始化(I)并且我能得到这个(II)吗?

很抱歉,不能使用该指针进行初始化。

这是我想要的但是动态的。

#include <stdio.h>

struct foo{
    int const * const a;
};

int main(void){
    int b = 5;
    struct foo x = {
        .a = &b
    };
    printf("%d\n", *(x.a));
}

我就是这样解决的。

我不知道是否是最好的选择。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct foo{
    int const * const a;
};

struct foo* newfoo(int *var){
    struct foo *tempD = malloc(sizeof(struct foo));
    struct foo tempS ={
        .a = var
    };
    memcpy(tempD, &tempS, sizeof(struct foo));

    return tempD;
}

int main(void){
    int b = 5;

    struct foo *z = newfoo(&b);

    printf("%d,\t%p\n", *(z->a), z->a);
    // this is equivalent to printf("%d,\t%p\n", b, &b);

    free(z);
}

4 个答案:

答案 0 :(得分:1)

int const * const a;是一种变量,常量意味着它不能被改变(第二个const),而第一个const意味着它指向常量数据。

将您的结构更改为:

struct foo{
    const int* a;
};

现在您可以为a分配值,但无法修改a点所在的值。

struct foo myFoo;
myFoo.a = (int *)5; //a points to location 5 now, valid
*myFoo.a = 4;       //Try to modify where a points = invalid and error

What is the difference between const int*, const int * const, and int const *?

答案 1 :(得分:1)

在这种情况下你必须使用memcpy;您无法通过const表达式进行分配:

int *temp = &y->b;
memcpy((void *)&x->a, &temp, sizeof temp);

为了实现x->a++你可以做到:

int *temp;
memcpy(&temp, &x->a, sizeof temp);
++temp;
memcpy((void *)&x->a, &temp, sizeof temp);

答案 2 :(得分:0)

初始化后你无法分配给x->a,所以你必须做一些愚蠢的事情:

struct faa *y = (struct faa*)malloc(sizeof(struct faa));
struct foo tmp = {&y->b};
struct foo *x = (struct foo*)malloc(sizeof(struct foo));
memcpy(x, &tmp, sizeof *x); 

答案 3 :(得分:0)

这是相同的情况:

  • 我锁上了门并扔掉了钥匙,因为在任何情况下,包括我在内的任何人都不应该打开那扇门。
  • 这样做之后,我注意到我无法打开门!
  • 我需要打开这扇门!我怎么做?我扔掉了钥匙。

你必须1)知道你在做什么,2)不要做你实际上不想做的事情,包括不要使程序设计规范与程序的实际需求相矛盾。

如果您打算更改指针指向的位置,只需将声明更改为int const* a;