gpt4 book ai didi

在 Visual Studio 中使用双结构 hack(灵活数组成员)的 C 代码

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:07 27 4
gpt4 key购买 nike

我正在尝试测试 Github 代码,它具有如下所示的结构 hack 技术。

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

typedef struct Node {
int wcount;
double weights[];
}Node;

typedef struct Layer {
int ncount;
Node nodes[];
}Layer;

void main()
{
Node* n = (Node*)malloc(sizeof(Node));
printf("%d\n", sizeof(n));
}

但是当我尝试在“Visual Studio C++”中编译和运行这段代码时,它在第 11 行给我错误:

 11:   Node nodes[];

但是这段代码在用gcc编译的Linux系统下运行,肯定没有语法错误。我想知道为什么它不起作用以及我应该怎么做才能在 Visual Studio 中使用它。

最佳答案

这不是“struct hack”,它是一种古老的、过时的方法,在结构的末尾编写类似 int array[1]; 的东西——这是完全不安全的,非-可移植和未定义的行为。

在 1990 年代,GCC 通过在结构的末尾声明一个零长度数组来实现非标准扩展来解决这个问题。这也是一种过时的技术。

在 1999 年,当 C 标准引入了一种叫做灵活数组成员的东西时,这个问题终于得到了永久性的解决。它们定义明确,语法为 type array[];

你必须像这样为他们分配空间:

typedef struct
{
...; // various data
int array[]; // flexible array member
}

type_t var = malloc( sizeof(var) + sizeof(int[n]) );

除上述之外的所有其他内容要么是肮脏的 hack 要么是非标准的 C,因此不应使用。


您的代码不起作用的原因可能是因为您没有在同一个 malloc 调用中为结构 + 灵活数组成员分配空间。

此外,C 模式下的 VS 已经无可救药地过时了。他们仍在努力实现 1999 年以来的所有 C 语言功能。根据您的 VS 版本,它可能不完全支持 C 语言。在 2017 年,我不建议使用这些旧的、C99 之前的编译器,因为现在有免费的现代编译器。

关于在 Visual Studio 中使用双结构 hack(灵活数组成员)的 C 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44689293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com