我可以在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);
}
答案 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;
。