当在printf中使用%d时,float变量会发生什么?

我正在尝试通过阅读C编程语言第2版来学习C. 我有一些编程经验,但没有C. 我目前在第1章。我有以下代码: float f; for (f = 0.0; f <= 3; f += 1.1) printf("A: %3f B: %6.2f\n", f, f + 0.15); 它打印输出: A: 0.000000 B: 0.15 A: 1.100000 B: 1.25 A: 2.200000 B: 2.35 看起来很好。 现在我按如下方式更改printf: printf(“A: %3d B: %6.2f\n”, f, f + 0.15); 新的输出是 A: 0 B: 0.00 A: -1610612736 B: 0.00 […]

在哪里找到stdio.h函数实现?

我研究C,我注意到我找不到某些头文件的实现文件,例如stdio.h ,它是一个包含很多输入/输出函数的库,比如printf 。 我在哪里可以找到它的实现?

如何在time.h中使用函数srand()?

我的程序包含的代码每次执行时都应生成一个随机的正整数。 它只生成一次随机数。 在那之后,当我执行相同的代码时,它给了我相同的值,并且它使我的代码无用。 我开始使用rand函数,然后我将srand()函数与time.h头文件一起使用,但它仍然无法正常工作。 #define size 10 for(i=0;i<size;i++) Arr[i] = rand()%size; 第一次通话(随机): 6 0 2 0 6 7 5 5 8 6 第二次通话(随机但与之前相同): 6 0 2 0 6 7 5 5 8 6 后来我访问了Stack Overflow问题,我读到了srand()函数,我用它作为: #include for(i=0;i<size;i++) Arr[i] = srand(time(NULL)); 第一个电话: -10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327 -10327 第二个电话: -10326 -10326 -10326 […]

当一个具有警告“控制到达非空函数结束”的函数被调用时,实际发生了什么?

我知道这个消息意味着什么,我只是想知道为什么它不是错误信息,而只是一个警告? 在这种情况下会发生什么? 例如,假设我有一个function int f() { } 当我打电话时会发生什么? 在这种情况下,编译器是否添加“非初始化” int返回? 或者丢失的返回可能导致堆栈损坏? 或者(绝对) 未定义的行为 ? 用gcc 4.1.2和4.4.3测试 编辑:阅读答案我理解一件事,阅读评论 – 另一个.. 好吧,让我们总结一下:它是未定义的行为 。 那么,这意味着可能导致堆栈损坏,对吧? (甚至意味着,我的电脑可能会开始通过麦克风插孔把腐烂的西红柿扔到我身上,尖叫 – “你做了什么?”)。 但如果是这样,那么为什么这里的最佳答案说,堆栈损坏不会发生,同时,行为是未定义的? 并且未定义? 调用者,尝试使用“未返回的值”,或只是函数的结尾是未定义的,如果它必须返回值,但它不是? 或者它不是未定义的行为,只是试图使用该值的用户(未返回,但是哦!)将“接收”未定义的值 ? 换句话说 – 只是一些垃圾价值,没有更多的事情可以发生?

如何将hex字符串转换为unsigned char数组?

例如,我有一个cstring “E8 48 D8 FF FF 8B 0D” (包括空格),需要将其转换为等效的无符号字符数组{0xE8,0x48,0xD8,0xFF,0xFF,0x8B,0x0D} 。 有效的方法是什么? 谢谢! 编辑:我不能使用标准库…所以考虑这是一个C问题。 对不起!

宣布主要原型

有什么理由我从未在C程序中看到main的原型声明,即: int main(int argc, char* argv[]); int main(int argc, char* argv[]) { return 0; } 似乎总是不一致..

C99是否保证arrays是连续的?

在另一个问题的热门评论主题之后,我开始讨论C99标准中有关C数组的内容和内容。 基本上当我定义一个2D数组如int a[5][5] ,标准C99是否保证它将是一个连续的整数块,我可以将其转换为(int *)a并确保我将拥有一个有效的一维25个整数数组。 正如我理解标准的那样,上面的属性隐含在sizeof定义和指针算术中,但是其他人似乎不同意并且说要转换为(int *)上面的结构给出了一个未定义的行为(即使他们同意所有现有的实现实际分配连续的价值观)。 更具体地说,如果我们认为一种实现可以检测数组检查所有维度的数组边界并在访问1D数组时返回某种错误,或者不能正确访问第1行以上的元素。 这样的实施可以是标准的编译吗? 在这种情况下,C99标准的哪些部分是相关的。

为什么GCC编译C程序需要.eh_frame部分?

测试是在32位x86 Linux上使用gcc 4.6.3 当使用gcc编译C程序并使用readelf检查部分信息时,我可以在里面看到.eh_frame部分和.eh_frame_hdr部分。 例如,这是二进制程序Perlbench的部分信息。 readelf -S perlbench There are 28 section headers, starting at offset 0x102e48: Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 08048154 000154 000013 00 A 0 0 1 [ 2] .note.ABI-tag […]

pthreads中的信号处理

我创建了一个pthread,并在其中安装了一个信号处理程序,与main( )函数中的方式相同。 线程的信号处理程序是一个单独的函数。 令人惊讶的是,它不起作用,即线程的信号处理程序无法捕获信号。 这是代码: #include #include #include #include #include typedef struct data { char name[10]; int age; }data; void sig_func(int sig) { printf(“Caught signal: %d\n”,sig); signal(SIGSEGV,sig_func); } void func(data *p) { printf(“This is from thread function\n”); signal(SIGSEGV,sig_func); // Register signal handler inside thread strcpy(p->name,”Mr. Linux”); p->age=30; sleep(2); // Sleep to catch the signal } […]

gcc结构中的内存对齐

我将应用程序移植到C中的ARM平台,该应用程序也在x86处理器上运行,并且必须向后兼容。 我现在有一些变量对齐的问题。 我已经阅读了__attribute__((aligned(4),packed))的gcc手册__attribute__((aligned(4),packed))我解释了所说的内容,因为struct的开头与4字节边界对齐,并且由于packed语句,内部保持不变。 最初我有这个,但偶尔它与4字节边界不对齐。 typedef struct { unsigned int code; unsigned int length; unsigned int seq; unsigned int request; unsigned char nonce[16]; unsigned short crc; } __attribute__((packed)) CHALLENGE; 所以我把它改成了这个。 typedef struct { unsigned int code; unsigned int length; unsigned int seq; unsigned int request; unsigned char nonce[16]; unsigned short crc; } __attribute__((aligned(4),packed)) CHALLENGE; 我之前说过的理解似乎是不正确的,因为结构现在都与4字节边界对齐,并且内部数据现在与4字节边界对齐,但由于字节顺序,结构的大小增加了大小从42到44个字节。 这个大小是至关重要的,因为我们有其他依赖于结构为42字节的应用程序。 […]