Tag: 初始化

如何在C中初始化指向结构的指针?

鉴于此结构: struct PipeShm { int init; int flag; sem_t *mutex; char * ptr1; char * ptr2; int status1; int status2; int semaphoreFlag; }; 这工作正常: static struct PipeShm myPipe = { .init = 0 , .flag = FALSE , .mutex = NULL , .ptr1 = NULL , .ptr2 = NULL , .status1 = -10 , .status2 […]

自动初始化局部变量

我有以下代码片段。 int j; printf(“%d”,j); 正如所料,我得到了垃圾值。 32039491 但是当我在上面的代码片段中包含一个循环时,就像 int j; print(“%d”,j); while(j); 我在该程序的多次试验中得到以下输出。 0 我一直认为局部变量默认初始化为垃圾值,但看起来变量在使用循环时会自动初始化。

初始化结构数组

这是我刚刚在其他人的问题中找到的初始化。 my_data data[]={ { .name = “Peter” }, { .name = “James” }, { .name = “John” }, { .name = “Mike” } }; 我之前从未见过这样的东西,也找不到解释.name可能是正确的。 我正在寻找的是这个过程如何逐步进行。 它看起来像是: 1) data; 2) *data; 3) (*data).name; 4) (*data).name=”Peter”; 还是我完全错了?

“来自指针的整数/整数的指针没有强制转换”问题

这个问题是整数和指针问题之间所有初始化/赋值的FAQ条目。 我想写一个指针设置为特定内存地址的代码,例如0x12345678 。 但是当用gcc编译器编译这个代码时,我得到“初始化使得整数没有强制转换的指针”警告/错误: int* p = 0x12345678; 类似地,这段代码给出了“初始化从没有强制转换的指针生成整数”: int* p = …; int i = p; 如果我在变量声明行之外做同样的事情,那么消息是相同的但是说“赋值”而不是“初始化”: p = 0x12345678; // “assignment makes pointer from integer without a cast” i = p; // “assignment makes integer from pointer without a cast” 其他流行编译器的测试也会给出错误/警告消息: clang说“指针转换不兼容的整数” icc说“ int类型的值不能用于初始化int*类型的实体” MSVC(cl)说“初始化int*与int*的间接级别不同”。 问题:以上示例是否有效? 还有一个后续问题: 这不会给出任何警告/错误: int* p = 0; 为什么不?

C中未初始化的变量

我有点困惑。 据我所知,如果你在C中声明一个int,而不是初始化它,例如: int x; 所以它的价值是不确定的。 因此,如果我们尝试使用它或应该有未定义的行为。 所以如果我在VS2010中运行以下代码它会使程序崩溃。 int main(){ int a; printf(“%d\n”,a); return 0; } 现在让我们来看看下一个代码,它不提供任何警告而且不会崩溃 (为什么?) void foo(int *var_handle){ // do nothing } int main(){ int a; foo(&a); printf(“%d\n”,a); // works, prints some big value return 0; } 你能解释一下这种行为吗? 我们只添加了对一个什么都不做的函数的调用,但现在程序不会崩溃。

Char数组初始化困境

考虑以下代码: // hacky, since “123” is 4 chars long (including terminating 0) char symbols[3] = “123”; // clean, but lot of typing char symbols[3] = {‘1’, ‘2’, ‘3’}; 所以, 扭曲实际上是在对代码的注释中描述的,有没有办法用字符串文字初始化char[]而不终止零? 更新 :看起来IntelliSense确实是错误的,这种行为在C标准中明确定义。

结构中的char数组 – 为什么strlen()在这里返回正确的值?

我有一个这样的简单程序: #include #include #include typedef struct { int numberOfDays; char name[10]; } Month; int main(void) { const Month months[12] = { { 31, {‘J’, ‘a’, ‘n’} }, { 28, {‘F’, ‘e’, ‘b’} } }; printf(“%zu\n”, strlen(months[0].name)); printf(“%zu\n”, sizeof(months[0].name)); printf(“%zu\n”, strlen(months[1].name)); printf(“%zu\n”, sizeof(months[1].name)); return 0; } 输出是这样的: 3 10 3 10 我理解为什么sizeof(months[i].name)打印10,但为什么strlen在这种情况下返回正确的值? 我的想法是, strlen计数直到第一个’\0′ ,但char name[3]数组不是null终止。 […]

字符串文字是否计为部分初始化程序并进行零初始化?

在C中,您可以部分初始化结构或数组,结果是初始化程序中未提及的成员/元素是零初始化的。 (C99第6.7.8.19节)。 例如:- int a[4] = {1, 2}; // a[0] == 1 // a[1] == 2 // a[2] == 0 // a[3] == 0 您还可以使用字符串文字(C99第6.7.8.14节)和“连续字符…初始化数组元素”来初始化“字符类型数组”。 例如:- char b[4] = “abc”; // b[0] == ‘a’ // b[1] == ‘b’ // b[2] == ‘c’ // b[3] == ‘\0’ 一切都很简单。 但是如果明确给出数组的长度会发生什么,但是使用太短而无法填充数组的文字? 剩余的字符是否已初始化,或者它们是否具有未定义的值? char c[4] = “a”; // c[0] […]

如何在C中的for(;;)循环中初始化几个变量?

我以为可以在for循环中初始化几个变量: for (int i = 0, char* ptr = bam; i < 10; i++) { … } 但我发现这是不可能的。 GCC给出以下错误: 错误:’char’之前的预期unqualified-id 你是否真的无法在for循环中初始化不同类型的变量?

检测不匹配的数组枚举初始值设定项

使用C进行嵌入式编程时,我发现自己多次使用枚举和数组进行映射,因为它们快速且内存效率高。 enum { ID_DOG = 0, ID_SPIDER, ID_WORM, ID_COUNT }; int const NumberOfEyes[ID_COUNT] = { 2, 8, 0 }; 问题是,有时在添加/删除项目时,我会犯错,枚举和数组不同步。 如果初始化列表太长,编译器将检测它,但不是其他方式。 那么有可靠和可移植的编译时检查初始化列表是否与数组的长度匹配?