首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C中初始化结构中的常量(使用malloc)

如何在C中初始化结构中的常量(使用malloc)
EN

Stack Overflow用户
提问于 2012-03-14 04:16:05
回答 3查看 37.2K关注 0票数 28

我试过了;

代码语言:javascript
复制
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;
}

这是编译器的错误:

代码语言:javascript
复制
gereksiz.c:3:17: error: expected ':', ',', ';', '}' or '__attribute__' before '=' token

还有,还有这个;

代码语言:javascript
复制
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;
}

这是编译器的错误:

代码语言:javascript
复制
gereksiz.c:10:5: error: assignment of read-only member 'a'
gereksiz.c:11:5: error: assignment of read-only member 'b'

两个都没有编译过。当使用malloc分配内存时,有没有办法初始化结构中的常量变量?

EN

回答 3

Stack Overflow用户

发布于 2012-03-14 04:41:44

你有没有尝试过这样做:

代码语言:javascript
复制
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;
}

我没有测试过,但是代码看起来是正确的

票数 11
EN

Stack Overflow用户

发布于 2015-02-18 08:52:53

有趣的是,我发现这种C99方式在clang中有效,但在gcc中不起作用。

代码语言:javascript
复制
int main(int argc, const char *argv[])
{
    struct deneme *pmydeneme = malloc(sizeof(struct deneme));
    *pmydeneme = (struct deneme) {15, 20};
    return 0;
}
票数 1
EN

Stack Overflow用户

发布于 2020-09-29 01:58:47

标准使用const关键字作为左值限定符和存储类之间的奇怪混合,但没有明确结构成员的含义。

如果有一个类型为struct S的结构s,其成员mT类型,则构造s.foo接受类型为struct S的左值,并从中派生类型为T的左值。如果T包含限定符,则该修饰符将影响由此产生的左值。

该标准肯定认识到这样一种可能性,即代码可能采用不是const-qualified的左值,由此派生出const-qualified的左值,派生自不是的左值--就像原始的那样,然后使用后一个左值修改对象。尚不清楚的是,在结构成员上使用const修饰符是否会影响对象的底层存储类,或者它是否只会使const修饰符应用于使用成员访问操作符形成的任何左值。我认为后一种解释更有意义,因为前者导致了许多模棱两可和不可行的角落案例,但我认为标准没有明确说明应该适用哪种解释。由于在前一种解释下将定义其行为的所有情况在后一种情况下将被相同地定义,我看不出标准的作者没有理由不认为后一种解释是更好的,但是他们可能想要保留这样的可能性,即在某些情况下,在某些实现上,前一种解释可能提供委员会没有预见到的一些优势实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9691404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档