我在C中有一个大数组(如果有所不同,则不是C++).我想将所有成员初始化为相同的值.我发誓我曾经知道一个简单的方法来做到这一点.我可以memset()在我的情况下使用,但是没有办法在C语法中构建这样做吗?
这不是建议的做法(也不是未定义的行为),而是关于将整数类型的所有字节转换为值的c ++标准实际上保证的内容
(unsigned char)0.
在下面的代码片段中,if-statement使用的表达式是否保证在c ++ 11中被评估为true?
std::memset (
reinterpret_cast<char*> (&a), // int a;
(unsigned char)0,
sizeof (int)
);
if (a == 0) {
...
}
Run Code Online (Sandbox Code Playgroud)
通过阅读C99和C++ 11标准中的引文(在本文中进一步说明),我们发现C99明确保证所有位设置为的整数类型0将表示该0类型中的值.
我在C++ 11标准中找不到这种保证.
5.2.1.2/1多字节字符
所有位为零的字节应被解释为与移位状态无关的空字符.这样的字节不应作为任何其他多字节字符的一部分出现.
6.2.6.2/1整数类型
任何填充位的值都是未指定的.45)符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值.
对于任何整数类型,所有位为零的对象表示应该是该类型中零值的表示.
2.3/3字符集[lex.charset]
基本执行字符集和基本执行宽字符集应各自包含基本源字符集的所有成员,以及表示alert,backspace和回车符的控制字符,以及空字符(分别为null宽字符),其表示具有全零位.
通常用于{0}初始化a struct或a,array但考虑第一个字段不是标量类型时的情况.如果第一个字段struct Person是另一个struct或数组,则该行将导致错误(error: missing braces around initializer).
struct Person person = {0};
Run Code Online (Sandbox Code Playgroud)
至少GCC允许我使用空的初始化列表来完成同样的事情
struct Person person = {};
Run Code Online (Sandbox Code Playgroud)
但这是有效的C代码吗?
另外:这条线是否保证给出相同的行为,即零初始化struct?
struct Person person;
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下语法将结构数组初始化为全0:
STRUCTA array[MAX] = {0};
Run Code Online (Sandbox Code Playgroud)
但是,我从gcc收到以下警告:
警告:初始化程序周围缺少大括号
我做错了什么 - 有另一种/更好的方法吗?
我有以下代码:
#include <iostream>
struct T
{
int a, b, c;
};
int main()
{
T t = {0};
std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}
Run Code Online (Sandbox Code Playgroud)
输出:
0,0,0
Run Code Online (Sandbox Code Playgroud)
经过多年的代码在一个关键的生产环境中愉快地运行,提供一个重要的功能,项目的要求发生了变化,我需要输出1,1,1.
于是,我换{0}到{1}:
#include <iostream>
struct T
{
int a, b, c;
};
int main()
{
T t = {1};
std::cout << t.a << ',' << t.b << ',' << t.c << '\n';
}
Run Code Online (Sandbox Code Playgroud)
输出:
1,0,0
Run Code Online (Sandbox Code Playgroud)
我1,1,1反而期待了. …
假设我有以下声明的变量:
char mychararray[35];
Run Code Online (Sandbox Code Playgroud)
我想将数组中的每个字符设置为一个空格......我该怎么做?
我的导师告诉我我所要做的就是把
mychararray = "";
Run Code Online (Sandbox Code Playgroud)
但这根本不起作用......
我使用的是过时版本的 Visual Studio (2012),还是这只是一个错误的初始化?如果是后者,请说明如何使所有字符都为空格。
提前致谢!
免责声明:我可能误解了如何创建,分配和初始化数组.如果是这样,请尝试在两行之间阅读.
如果我通过做创建一个数组
int array[15] = {0};
Run Code Online (Sandbox Code Playgroud)
array编译器的所有元素都将元素初始化为0.这是如何通过编译器完成的?编译器是否插入一个循环来迭代分配的内存并将每个元素设置为零?尺寸会影响性能吗?即初始化双倍大小(30)的数组需要更长的时间吗?多久了?双?对数?2的力量?
只是出于好奇而退出.
我编写以下代码并在xcode中设置断点:
#include <iostream>
using namespace std;
int main(int argc, const char * argv[])
{
int array[12];
return 0; //Set breakpoint here
}
Run Code Online (Sandbox Code Playgroud)

调试器面板显示前6个元素包含非零ints.为什么是这样?
有12个元素*prim数组,初始化只有7个元素.这是代码:
int f(int input)
{
char *prim[12] = {"2", "3", "5", "7", "11", "13", "17"};
int i;
for(i=0; i<12; i++)
{
if(i % input == 0)
{
strcat(result, prim[i]);
strcat(result, " ");
}
}
if(strlen(result) == 0)
{
printf("return -1");
}
else
{
printf("%s\n", result);
printf("return 0");
}
}
Run Code Online (Sandbox Code Playgroud)
当i = 8调试器给我一个访问冲突读取位置.
我的朋友给了我关于他大学的编程基础课的考试样本,我需要帮他传递它.
所以,我的问题是:有没有我不知道的关于C语言编程的东西,或者教授在声明*prim时犯了错误?