只是好奇,如果我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是第一个,但它并不完整) - 其他人指出它实际用于尾部填充结构,虽然相关,但不是正是我想要的.
当我查看Linux内核代码时,找到以下代码:
struct thread_info {
struct task_struct *task;
struct exec_domain *exec_domain;
unsigned long flags;
__u32 status;
__u32 cpu;
int preempt_count;
mm_segment_t addr_limit;
struct restart_block restart_block;
void __user *sysenter_return;
unsigned long previous_esp;
__u8 supervisor_stack[0];
};
Run Code Online (Sandbox Code Playgroud)
注意最后一个变量"supervisor_stack",它是一个零长度数组,它的用法是什么?提前致谢!
我今天接受系统编程课程的教授告诉我们,最后定义一个零长度数组的结构:
struct array{
size_t size;
int data[0];
};
typedef struct array array;
Run Code Online (Sandbox Code Playgroud)
这是一个有用的结构,用于定义或初始化带有变量的数组,即如下所示:
array *array_new(size_t size){
array* a = malloc(sizeof(array) + size * sizeof(int));
if(a){
a->size = size;
}
return a;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,使用malloc(),我们还为大小为零的数组分配内存.这对我来说是全新的,而且看起来很奇怪,因为从我的理解来看,结构不必在连续的位置上有它们的元素.
为什么代码在array_new内存中分配data[0]?那么,为什么要访问它是合法的
array * a = array_new(3);
a->data[1] = 12;
Run Code Online (Sandbox Code Playgroud)
?
从他告诉我们的内容来看,似乎在结构的末尾定义为长度为零的数组确保在结构的最后一个元素之后立即出现,但这看起来很奇怪,因为再次,根据我的理解,结构可能有填充.
我也看到这只是gcc的一个特性,并没有任何标准定义.这是真的?
编辑:显然其中一些不允许/已在各种C标准中发生变化.对于我自己的假设好处,让我们假装我们使用gcc test.c没有标准或警告选项.
特别是我正在研究引擎盖下的细节.我加入了目前的理解.我对吗?
char **c1; //Size for a pointer is allocated on the stack. sizeof(c1) == sizeof(void*)
char *c2[0]; //Nothing is allocated on the stack. sizeof(c2) == 0
Run Code Online (Sandbox Code Playgroud)
这两个我不知道的情况(除了sizeof)还有其他的区别吗?
struct a {
int i;
char c[0]; //sizeof(a) is sizeof(int)? a.c == (&i)+1?
};
Run Code Online (Sandbox Code Playgroud)
据我了解,这通常用于结构末端的可变长度数组.但是关于
struct b {
char *c[0] //sizeof(b) is 0? where does c point?
};
int j;
struct b myb; //myb.c == (&j)+1 == $esp?
Run Code Online (Sandbox Code Playgroud)
如果零指针的地址从未在任何地方分配,那么零长度数组的地址如何知道呢?我认为常规数组的地址已知的方式相同,但我现在正在努力绕过它.
我是C++的新手.我正在阅读迈克尔道森的"通过游戏编程开始C++".但是,我对编程并不陌生.我刚刚完成了一个处理向量的章节,所以我对它们在现实世界中的使用有疑问(我是一名计算机科学专业的学生,所以我还没有太多真实的经验).
作者在每章末尾都有一个Q/A,其中一个是:
问:我应该何时使用向量而不是数组?
答:差不多总是如此.向量是高效和灵活的.它们确实比阵列需要更多的内存,但这种权衡几乎总是值得的.
你们有什么感想?我记得在Java书中学习过向量,但是在我的Comp totro中我们根本没有介绍它们.科学.上课,也不是我在大学的数据结构课.我也从未见过它们用于任何编程任务(Java和C).虽然我知道学校代码和现实世界的代码可能会有很大不同,但这让我觉得它们并没有被大量使用.
我不需要被告知两个数据结构之间的差异; 我非常了解他们.我想知道的是,如果作者在他的Q/A中给出了很好的建议,或者他只是想让初学者程序员免于破坏管理固定大小数据结构的复杂性.另外,不管你怎么想作者的意见,你怎么看在现实世界往往?
谢谢,
杰拉德
最近我遇到了一个结构定义,
struct arr {
int cnt;
struct {
int size;
int *name;
} list[0];
};
Run Code Online (Sandbox Code Playgroud)
现在我不知道list[0]被宣布的原因.我感兴趣的是为什么使用它.它有什么优势吗?如果是,那是什么?
我正在阅读关于malloc(first-fit)实现的脚本,我对元数据结构的值赋值有点困惑.任何人都可以给出一些解释为什么malloc返回flag_block->ptr(作为指向已分配内存的指针)?据我所知,没有具体的任务.
typedef struct _metadata {
size_t size;
char free;
struct _metadata* next;
struct _metadata* prev;
char ptr[];
} metadata;
metadata* flag_block = NULL;
void *malloc(size_t size)
{
if (size==0) {
return NULL;
}
if (flag_block == NULL) {
flag_block = sbrk(size);
sbrk(sizeof(metadata));
if (flag_block == (void *)-1) {
return NULL;
}
flag_block->free = 0;
flag_block->next=NULL;
flag_block->prev=NULL;
flag_block->size = size;
return flag_block->ptr;
} else {
/*
....
*/
}
}
Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用SFINAE.我正在尝试使用它来根据serialize()对象中函数的存在来选择函数实现.
这是我用来确定的代码,如果类型定义了serialize()函数:
template <typename T>
class HasSerialize {
private:
typedef char yes[1];
typedef char no[2];
template <typename C> static yes& test(char[sizeof(&C::serialize)]) ;
template <typename C> static no& test(...);
public:
static const bool value = sizeof(test<T>(0)) == sizeof(yes);
};
Run Code Online (Sandbox Code Playgroud)
但是,它似乎在GCC和Clang上给出了完全相同的结果.假设以下代码:
template<bool T>
class NVPtypeSerializer {
public:
template<typename C>
static xmlChar* serialize(C value) {
// serize() is not available
}
};
template<>
struct NVPtypeSerializer<true> {
public:
template<typename T>
static xmlChar* serialize(T value) {
return value.serialize();
}
};
Run Code Online (Sandbox Code Playgroud)
这被称为:
foo = …Run Code Online (Sandbox Code Playgroud) 好吧,经过一整年的编程并且只了解数组之后,我意识到了向量的存在(由 StackOverflow 的一些成员在我之前的一篇文章中)。我自己做了大量的研究和研究,并重写了我用数组、链表和向量编写的整个应用程序。此时,我不确定是否还会使用数组,因为向量似乎更加灵活和高效。由于它们具有自动增大和缩小大小的能力,我不知道我是否会同样多地使用数组。在这一点上,我个人认为数组的唯一优点是更容易编写和理解。数组的学习曲线没什么,向量的学习曲线很小。不管怎样,我确信在某些情况下使用数组和在其他情况下使用向量可能有充分的理由,我只是好奇社区的想法。我完全是一个新手,所以我认为我对两者的严格用法都不够了解。
如果有人稍微好奇的话,这就是我正在练习使用向量的应用程序。它真的很粗糙,需要大量的工作: https ://github.com/JosephTLyons/Joseph-Lyons-Contact-Book-Application
BITMAPINFO 结构有以下声明
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
Run Code Online (Sandbox Code Playgroud)
为什么RGBQUAD数组是静态的?为什么它不是指针?