何时{0}用于初始化对象,这是什么意思?我找不到任何{0}地方的任何引用,并且由于大括号,谷歌搜索没有帮助.
示例代码:
SHELLEXECUTEINFO sexi = {0}; // what does this do?
sexi.cbSize = sizeof(SHELLEXECUTEINFO);
sexi.hwnd = NULL;
sexi.fMask = SEE_MASK_NOCLOSEPROCESS;
sexi.lpFile = lpFile.c_str();
sexi.lpParameters = args;
sexi.nShow = nShow;
if(ShellExecuteEx(&sexi))
{
DWORD wait = WaitForSingleObject(sexi.hProcess, INFINITE);
if(wait == WAIT_OBJECT_0)
GetExitCodeProcess(sexi.hProcess, &returnCode);
}
Run Code Online (Sandbox Code Playgroud)
没有它,上面的代码将在运行时崩溃.
我需要在C中使用一个大的空数组作为全局数组.除了输入外,还有什么方法可以做到这一点
char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };
Run Code Online (Sandbox Code Playgroud)
?
例如,如果somestruct有三个整数成员,我一直认为在C(或C++)函数中执行此操作是可以的:
somestruct s = {123,};
Run Code Online (Sandbox Code Playgroud)
第一个成员将初始化为123,最后两个成员将初始化为0.我经常对自动数组执行相同的操作,写入int arr[100] = {0,};以便将数组中的所有整数初始化为零.
最近我在GNU C参考手册中读到:
如果不初始化结构变量,则效果取决于它是否具有静态存储(请参阅存储类说明符).如果是,则使用0初始化具有整数类型的成员,并将指针成员初始化为NULL; 否则,结构成员的价值是不确定的.
有人可以告诉我C和C++标准对部分自动结构和自动数组初始化的看法吗?我在Visual Studio中执行上述代码没有问题,但我希望与gcc/g ++兼容,也可能与其他编译器兼容.谢谢
众所周知,标量数组的缺少初始值设定值默认为零.
int A[5]; // Entries remain uninitialized
int B[5]= { 0 }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud)
但是这(下面)保证了吗?
int C[5]= { }; // All entries set to zero
Run Code Online (Sandbox Code Playgroud) 假设我有一些遗留代码,除非发现错误,否则无法更改,并且它包含以下代码:
bool data[32];
memset(data, 0, sizeof(data));
Run Code Online (Sandbox Code Playgroud)
这是bool将数组中的所有false值设置为值的安全方法吗?
更一般地,是安全的memset一bool对0,以使其价值false?
是否保证可以在所有编译器上运行?或者我是否要求修复?
以下代码是否有效?如果是这样,范围是x什么?
int main()
{
if (true) int x = 42;
}
Run Code Online (Sandbox Code Playgroud)
我的直觉说没有创建范围if因为没有实际的block({})跟随它.
我们知道 C++ 允许用零初始化 C 风格的数组:
int a[5] = {0};
// or
int a[5] = {};
Run Code Online (Sandbox Code Playgroud)
对于 std::array 也同样有效
std::array a<int, 5> = {};
Run Code Online (Sandbox Code Playgroud)
但是,这行不通:
int a[5] = {33}; // in memory( 33, 0, 0, 0, 0 )
std::array<int, 5> = {33}; // in memory( 33, 0, 0, 0, 0 )
Run Code Online (Sandbox Code Playgroud)
vector有没有办法在不使用or 的情况下用非零值初始化整个数组algorhtm?
也许constexpr可以帮忙?最好的解决方案是什么?
附:
GCC 提供了这种语法
int a[5] = {[0 ... 4] = 33};
Run Code Online (Sandbox Code Playgroud)
但我不确定它对于其他编译器是否有效。
我想知道是否在C中声明了一个int元素数组.是否有一个模式,根据该模式,只有数组的某些值被赋值为0而其他值存储垃圾值?例如:
#include <stdio.h>
void main()
{
int a[5];
int i;
for (i=0;i<=4;i++)
{
printf("%d\n",a[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
编译并运行程序后,我得到了这个输出,即
0
0
4195344
0
2107770384
Run Code Online (Sandbox Code Playgroud)
所以零存在a[0], a[1]并且a[3]while a[2]每次编译和运行时包含相同的值,而a[4]值保持变化(包括负数).为什么只发生一个数组的某些固定索引被初始化为零并且它是否与过去的内存空间分配有关?
struct Foo
{
char name[10];
int i;
double d;
};
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用以下方法对此类 POD 类型的所有成员进行零初始化:
Foo foo = {0};
Run Code Online (Sandbox Code Playgroud)
我可以进一步简化为:
Foo foo = {};
Run Code Online (Sandbox Code Playgroud)
喜欢原生数组?( int arr[10] = {};)
我不是在用 初始化时询问{0},除了第一个成员之外的成员是否都初始化为零。我知道这个问题的答案是肯定的。我在问是否0可以在语法上省略第一个。
我在这个主题上找到的大多数教程都建议使用{0},不使用{},例如,本指南,并且将其解释为This works 因为聚合初始化规则是递归的;,这比解释更令人困惑。
免责声明:我可能误解了如何创建,分配和初始化数组.如果是这样,请尝试在两行之间阅读.
如果我通过做创建一个数组
int array[15] = {0};
Run Code Online (Sandbox Code Playgroud)
array编译器的所有元素都将元素初始化为0.这是如何通过编译器完成的?编译器是否插入一个循环来迭代分配的内存并将每个元素设置为零?尺寸会影响性能吗?即初始化双倍大小(30)的数组需要更长的时间吗?多久了?双?对数?2的力量?
只是出于好奇而退出.