相关疑难解决方法(0)

如果我在C/C++中定义0大小的数组会发生什么?

只是好奇,如果我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是第一个,但它并不完整) - 其他人指出它实际用于尾部填充结构,虽然相关,但不是正是我想要的.

c c++ arrays

120
推荐指数
7
解决办法
5万
查看次数

数组零长度

我正在重构一些旧的代码,并发现很少的结构包含零长度数组(如下).当然,由pragma压制的警告,但我没有通过包含这种结构的"新"结构创建(错误2233).数组'byData'用作指针,但为什么不使用指针呢?或长度为1的数组?当然,没有添加任何评论让我喜欢这个过程...任何使用这种东西的原因?重构那些的任何建议?

struct someData
{
   int nData;
   BYTE byData[0];
}
Run Code Online (Sandbox Code Playgroud)

NB它是C++,Windows XP,VS 2003

c++ arrays visual-c++ flexible-array-member

51
推荐指数
4
解决办法
3万
查看次数

我可以使用`operator delete []`进行单个元素数组分配吗?

如果我们分配一个大小为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[]

注意

能否请您回复标准以支持您的答案?

c++

8
推荐指数
2
解决办法
2808
查看次数

可以通过这种方式实现"struct hack"吗?

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)

c++ struct

6
推荐指数
3
解决办法
624
查看次数

为什么空数组的大小为0但空类的大小不为0?

例如:

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)

请告诉我是否有任何理由支持编译器行为

c++ gcc g++

5
推荐指数
1
解决办法
2723
查看次数

无限值和缓冲区

我有一个记分板,可以随时获得更新信息,缓冲区大小=我的记分板可以处理的行数,但我试图使其无限制地无限.

我想要做的是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)

c++

0
推荐指数
1
解决办法
610
查看次数

标签 统计

c++ ×6

arrays ×2

c ×1

flexible-array-member ×1

g++ ×1

gcc ×1

struct ×1

visual-c++ ×1