具有数组成员的结构

一些名字

我正在研究结构,并且遇到了一些误解。我写了几个例子:

#include <stdio.h>

struct test{
    char field[16];
};


int main(int argc, char * argv[]){
    const char *string = "some string";
    struct test t1 = {.field = *string};
    struct test t2 = {.field = string};
    struct test t3 = {.field = "some string"};
    struct test t4 = {{'s', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'}};


    printf("t1::field = %s\n", t1.field); //prints s
    printf("t2::field = %s\n", t2.field); //prints garbage character
    printf("t3::field = %s\n", t3.field); //prints some string
    printf("t4::field = %s\n", t4.field); //prints some string
}

输出:

t1::field = s
t2::field = 4
t3::field = some string
t4::field = some string

异丁酮

另一个例子是

#include <stdio.h>

struct test{
    char field[16];
};

int main(void) {
    const char *string = {'s', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'};
    struct test t = {.field = *string};

    printf("t::field = %s\n", t.field); //segfault
}

输出为空。

异丁酮

这种行为对我来说还不是很清楚。分配数组内存时,我们可以将其第n个元素arr[n]扩展为*(arr + n)因此,我希望我们char field[16]使用some进行初始化char *,将指针所指向的对象视为某个数组的第一个元素就足够了。

但是从行为来看,我的理解是完全错误的。您能对此做一个简短的解释吗?

大卫·兰金
struct test{
    char field[16];
};

包含一个包含16个字符字符数组 field数组可以初始化或复制到,但不能分配

有效

    struct test t1 = {.field = *string};

(初始化t1.fieldstring[0](例如*(string + 0)*string

无效

    struct test t2 = {.field = string};

(试图分配一个指针字符串文字到阵列中,见C11标准- 6.3.2.1其它操作数-左值,数组和功能指示符(P3)

有效

    struct test t3 = {.field = "some string"};

(使用字符串文字初始化数组)

有效

    struct test t4 = {{'s', 'o', 'm', 'e', ' ', 's', 't', 'r', 'i', 'n', 'g', '\0'}};

t4t3使用括号括起来的初始化器相同,省略named-initializer ,该初始化.field器指示从第一个成员开始进行成员填充,与之相同,请参阅C11标准§6.7.9初始化(p19)

您的“另一个示例”由于相同的原因而t2失败。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

返回具有数组成员的本地结构

具有灵活数组成员的结构的“数组”

与具有柔性数组成员的匿名结构联合

具有灵活数组成员的结构的大小

具有弹性char数组成员的结构

如何将内存分配给具有数组成员的类实例?

如何均匀地分配具有灵活数组成员的结构体数组?

具有灵活数组成员的结构的数组如何表现?

循环访问所有数组成员

具有灵活数组成员的结构和具有指针成员的结构之间的区别

是否允许返回具有灵活数组成员的结构?

比较指向具有灵活数组成员的结构的 2 个指针

如何初始化具有 unint_t 作为灵活数组成员的结构?

sizeof()具有零长度数组成员的结构

C ++“替换”为具有灵活数组成员的结构

具有静态数组成员变量的迭代器

类具有带动态数组成员的类

具有基本类型的单个数组成员的标准布局结构的保证内存布局

使用std :: index_sequence初始化具有固定大小数组成员的POD结构容器

涉及数组和带有数组成员的对象的复杂过滤

没有命名成员的GCC错误结构灵活数组成员

匹配文档,其中所有数组成员都不包含值

我如何将私有数据与公共数组成员相关联?

从具有灵活数组成员的结构强制转换为没有该变量的其他结构是否是未定义的行为?

具有零长度数组成员的结构,是另一个结构的一部分

为什么使用灵活的数组成员进行的结构初始化无效但对于固定大小的数组成员却有效?

当我对结构进行浅拷贝时,灵活数组成员没有被复制

什么是结构中的灵活数组成员?

未命名结构的灵活数组成员