只是好奇,如果我int array[0];在代码中定义零长度数组会发生什么?海湾合作委员会根本没有抱怨.
示例程序
#include <stdio.h>
int main() {
int arr[0];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
澄清
我实际上是在试图弄清楚零长度数组是否以这种方式初始化,而不是像Darhazer的注释中那样指向可变长度,是否优化了.
这是因为我必须释放一些代码,所以我想弄清楚我是否必须处理SIZE定义为的情况0,这在一些静态定义的代码中会发生int array[SIZE];
我真的很惊讶海湾合作委员会没有抱怨,这导致了我的问题.根据我收到的答案,我认为缺少警告主要是因为支持未使用新[]语法更新的旧代码.
因为我主要是想知道这个错误,所以我将Lundin的答案标记为正确(Nawaz是第一个,但它并不完整) - 其他人指出它实际用于尾部填充结构,虽然相关,但不是正是我想要的.
我正在重构一些旧的代码,并发现很少的结构包含零长度数组(如下).当然,由pragma压制的警告,但我没有通过包含这种结构的"新"结构创建(错误2233).数组'byData'用作指针,但为什么不使用指针呢?或长度为1的数组?当然,没有添加任何评论让我喜欢这个过程...任何使用这种东西的原因?重构那些的任何建议?
struct someData
{
int nData;
BYTE byData[0];
}
Run Code Online (Sandbox Code Playgroud)
NB它是C++,Windows XP,VS 2003
如果我们分配一个大小为1的对象,如下所示
int *arr = new int[1];
Run Code Online (Sandbox Code Playgroud)
我们应该使用operator delete[]或删除对象operator delete吗?
我担心的原因是编译器是否足够智能将语句转换为单个元素分配int *arr = new int,这将导致调用operator delete[]UB.
用户案例:
我有一个指针,我最终会以不同的方式分配,但最终会想要删除它.所以很想知道,对于单个元素分配,如果我一直使用,我int *arr = new int[1]可以一贯安全地使用operator delete[]
注意
能否请您回复标准以支持您的答案?
Struck hack用于分配比结构本身初始需要更多的内存,以便您可以引用数组的越界部分,以便保留在实际分配的内存中.
这是它的工作原理.
struct Foo
{
// ..
size_t size;
int data[1];
};
const size_t SIZE = 100;
Foo *p = (Foo*) malloc(sizeof(Foo) + sizeof(int) * (SIZE - 1));
p->size = SIZE;
for (int i = 0; i < p->size; ++i) (p->data)[i] = i;
Run Code Online (Sandbox Code Playgroud)
题:
我们可以只使用一个整数而不是一个大小为1的数组吗?如果这是可行的,那么为什么数组大小版本变得更受欢迎呢?
struct Foo
{
// ..
size_t size;
int data;
};
// ..
for (int i = 0; i < p->size; ++i) (&p->data)[i] = i;
Run Code Online (Sandbox Code Playgroud) 例如:
int main() {
struct {} foo;
int bar[0];
struct {
int dummy[0];
} baz;
cout << sizeof(foo) << endl; //display '1'
cout << sizeof(bar) << endl; //display '0'
cout << sizeof(baz) << endl; //display '0'
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请告诉我是否有任何理由支持编译器行为
我有一个记分板,可以随时获得更新信息,缓冲区大小=我的记分板可以处理的行数,但我试图使其无限制地无限.
我想要做的是as-sign无穷大值到这样的缓冲区:
const int infinity = std::numeric_limits<const int>::infinity();
char Buffer_format_text [infinity];
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为它说:
错误C2057:预期的常量表达式错误C2466:无法分配常量大小为0的数组
有没有办法做到这一点?还是骗术?, 请帮我.不要问我为什么要这样做,我问怎么做.
更新:
这是我用sprintf做的,你怎么在ostringstream?
char Buff[100];
int length = 0;
int amount_of_space = 8;
length += sprintf(Buff+length,"%-*s %s\n", amount_of_space, "Test", "Hello");
Run Code Online (Sandbox Code Playgroud)
this output: Test Hello
Run Code Online (Sandbox Code Playgroud)