这可能是一个愚蠢的问题,但是可以为数组而不是全部分配一些值吗?澄清我想要的东西:
如果我需要一个像{1,0,0,0,2,0,0,0,3,0,0,0}我可以创建它的数组:
int array[] = {1,0,0,0,2,0,0,0,3,0,0,0};
Run Code Online (Sandbox Code Playgroud)
该数组的大多数值都是'0'.是否可以跳过此值并仅分配值1,2和3?我想到的是:
int array[12] = {0: 1, 4: 2, 8: 3};
Run Code Online (Sandbox Code Playgroud) #include<stdio.h>
int main(void) {
int a=(1, 2), 3;
printf("%d", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:2
任何人都可以解释输出是2吗?
我不明白为什么这样做是错的:
const int n = 5;
int x[n] = { 1,1,3,4,5 };
Run Code Online (Sandbox Code Playgroud)
即使n已经是const值.
虽然这样做似乎适合GNU编译器:
const int n = 5;
int x[n]; /*without initialization*/
Run Code Online (Sandbox Code Playgroud)
我知道C99的VLA功能,我认为这与正在发生的事情有关,但我只需要澄清背景中发生的事情.
考虑函数调用(调用int sum(int, int))
printf("%d", sum(a,b));
Run Code Online (Sandbox Code Playgroud)
编译器如何确定,函数调用中使用的函数sum(int, int)不是逗号运算符?
注意:我不想在函数调用中实际使用逗号运算符.我只是想知道编译器如何知道它不是逗号运算符.
在不同的网站上阅读了一些答案后,我现在很困惑.因此,提及DBMS和RDBMS之间的关键区别以及它们之间的任何关系会很有帮助.
我有两个结构定义如下:
struct EmptyStruct{
};
struct StructEmptyArr{
int arr[0];
};
int main(void){
printf("sizeof(EmptyStruct) = %ld\n", sizeof(EmptyStruct));
printf("sizeof(StructEmptyArr) = %ld\n", sizeof(StructEmptyArr));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Ubuntu 14.04,x64上用gcc(g ++)4.8.4编译.
输出(对于gcc和g ++):
sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0
Run Code Online (Sandbox Code Playgroud)
我能理解为什么sizeof(EmptyStruct)等于1但不能理解为什么sizeof(StructEmptyArr)等于0.为什么两者之间存在差异?
我今天接受系统编程课程的教授告诉我们,最后定义一个零长度数组的结构:
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的一个特性,并没有任何标准定义.这是真的?
在函数中使用变长数组作为参数时
int sum(int n, int a[n]);
Run Code Online (Sandbox Code Playgroud)
很容易理解第一个参数(n)指定第二个参数(a)的长度.但遇到另一个用于VLA的原型作为参数
int sum(int n, int a[*]);
Run Code Online (Sandbox Code Playgroud)
真的很难理解为什么*用而不是在n里面[]?
我试图找出如何检查一个字符是否等于C中的空格.我知道标签是'\t'和换行符'\n',但我希望能够检查一个常规的正常空间(来自空格键)在一份if声明中.
有谁知道这是什么角色?
以下看起来像编译错误:
struct : Base { };
Run Code Online (Sandbox Code Playgroud)
然而,当使用 [1]它似乎工作:
#include <iostream>
using namespace std;
template<bool B>
struct A
{
struct : std::integral_constant<bool, B> {
} members;
};
int main()
{
A<true> a;
cout << a.members.value << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在c ++中它是否适用于未命名的结构继承?有没有这个用户的例子?
[1]免责声明:我不是假装提供的示例很有用.我很少使用未命名的结构,当我这样做时,它们通常将一些内置成员变量捆绑在一起,以便为类提供更清晰的接口.这个问题从观测上来memberspaces不需要nammed结构