我试过了;
void *malloc(unsigned int);
struct deneme {
const int a = 15;
const int b = 16;
};
int main(int argc, const char *argv[])
{
struct deneme *mydeneme = malloc(sizeof(struct deneme));
return 0;
}
这是编译器的错误:
gereksiz.c:3:17: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token
还有,还有这个;
void *malloc(unsigned int);
struct deneme {
const int a;
const int b;
};
int main(int argc, const char *argv[])
{
struct deneme *mydeneme = malloc(sizeof(struct deneme));
mydeneme->a = 15;
mydeneme->b = 20;
return 0;
}
这是编译器的错误:
gereksiz.c:10:5: error: assignment of read-only member 'a'
gereksiz.c:11:5: error: assignment of read-only member 'b'
两个都没有编译过。当使用malloc分配内存时,有没有办法初始化结构中的常量变量?
发布于 2012-03-14 04:41:44
你有没有尝试过这样做:
int main(int argc, const char *argv[])
{
struct deneme mydeneme = { 15, 20 };
struct deneme *pmydeneme = malloc(sizeof(struct deneme));
memcpy(pmydeneme, &mydeneme , sizeof(mydeneme));
return 0;
}
我没有测试过,但是代码看起来是正确的
发布于 2015-02-18 08:52:53
有趣的是,我发现这种C99方式在clang中有效,但在gcc中不起作用。
int main(int argc, const char *argv[])
{
struct deneme *pmydeneme = malloc(sizeof(struct deneme));
*pmydeneme = (struct deneme) {15, 20};
return 0;
}
发布于 2020-09-29 01:58:47
标准使用const
关键字作为左值限定符和存储类之间的奇怪混合,但没有明确结构成员的含义。
如果有一个类型为struct S
的结构s
,其成员m
为T
类型,则构造s.foo
接受类型为struct S
的左值,并从中派生类型为T
的左值。如果T
包含限定符,则该修饰符将影响由此产生的左值。
该标准肯定认识到这样一种可能性,即代码可能采用不是const
-qualified的左值,由此派生出const
-qualified的左值,派生自不是的左值--就像原始的那样,然后使用后一个左值修改对象。尚不清楚的是,在结构成员上使用const
修饰符是否会影响对象的底层存储类,或者它是否只会使const
修饰符应用于使用成员访问操作符形成的任何左值。我认为后一种解释更有意义,因为前者导致了许多模棱两可和不可行的角落案例,但我认为标准没有明确说明应该适用哪种解释。由于在前一种解释下将定义其行为的所有情况在后一种情况下将被相同地定义,我看不出标准的作者没有理由不认为后一种解释是更好的,但是他们可能想要保留这样的可能性,即在某些情况下,在某些实现上,前一种解释可能提供委员会没有预见到的一些优势实现。
https://stackoverflow.com/questions/9691404
复制相似问题