使用printf 在c中的fork()

有2个不同的程序,它们很小,例如: int main() { printf (“print hello”); fork(); } int main() { printf (“print hello\n”); fork(); } 输出1是:`print helloprint hello 输出2是: print hello 问题是,为什么带有\n那个只打印一次,而第一个打印两次?

打印从1到100的素数

此c ++代码打印出以下素数: 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97。 但我认为这不是我的书想要写的方式。 它提到了一些关于数字的平方根的东西。 所以我确实尝试将我的第二个循环改为for (int j=2; j<sqrt(i); j++)但它没有给我我需要的结果。 我如何才能将此代码更改为我的书所希望的方式? int main () { for (int i=2; i<100; i++) for (int j=2; j<i; j++) { if (i % j == 0) […]

关于malloc和sizeof的新手问题

有人可以向我解释为什么我对字符串大小为6的malloc的调用返回4字节的sizeof? 事实上,我给malloc的任何整数参数我得到sizeof为4.接下来,我试图复制两个字符串。 为什么我复制的字符串输出(NULL)? 以下是我的代码: int main() { char * str = “string”; char * copy = malloc(sizeof(str) + 1); printf(“bytes allocated for copy: %d\n”, sizeof(copy)); while(*str != ‘\0’){ *copy = *str; str++; copy++; } copy = ‘\0’; printf(“%s\n”, copy); }

unsigned char的格式说明符

说我想打印unsigned char : unsigned char x = 12; 哪个是对的。 这个: printf(“%d”,x); 或这个: printf(“%u”,x); ? 事情就在其他地方我遇到过这样的讨论: – 即使ch已更改为unsigned char,代码的行为也不是由C标准定义的。 这是因为unsigned char被提升为int(在普通的C实现中),因此将int传递给printf以获取指定符%u。 但是,%u期望unsigned int,因此类型不匹配,并且C标准不定义行为 – 你的评论不正确。 C11标准规定转换说明符必须与函数参数本身的类型相同,而不是提升类型。 这一点也在hh length修饰符的描述中得到了具体解决:“参数将根据整数提升进行提升,但其值应在打印前转换为signed char或unsigned char” 哪个是正确的? 任何可靠的消息来源都说这个问题? (在这个意义上我们还应该用%d打印unsigned short int,因为它可以被提升为int ?)。

有没有办法在编译时计算整数类型的宽度?

以char / bytes为单位的整数类型(或任何类型)的大小很容易计算为sizeof(type) 。 常见的习惯用法是乘以CHAR_BIT以找到该类型占用的位数,但是在使用填充位的实现中,这将不等于值位的宽度 。 更糟糕的是,代码如下: x>>CHAR_BIT*sizeof(type)-1 如果CHAR_BIT*sizeof(type)大于CHAR_BIT*sizeof(type)的实际宽度,则实际上可能具有未定义的行为。 为简单起见,我们假设我们的类型是无符号的。 那么type的宽度是ceil(log2((type)-1) 。有没有办法将这个值计算为常量表达式?

代表双打中的整数

双精度数(给定数量的字节,具有合理的尾数/指数平衡)是否总能完全精确地保持无符号整数范围的一半,即该字节数的一半? 例如,8字节双精度可以完全精确地保持四字节无符号整数的范围吗? 这将归结为如果一个双字节浮点数可以保持一个字节unsigned int的范围。 一个字节的unsigned int当然是0 – > 255。

getopt.h:在Windows中编译Linux C代码

我试图在Windows下编译一组九个* .c文件(以及九个相关的* .h文件)。 该代码最初是在Linux中设计的,用于使用标准GNU-Linux / C库“getopt.h”获取命令行参数。 该库不适用于在Windows中构建C代码。 我想忽略我的代码现在所做的事情并提出以下问题。 对于那些熟悉这个C库“getopt.h”的人:如果它依赖于POSIX风格的命令行参数,是否可以在Windows中构建和运行我的代码? 或者我是否必须重新编写适用于Windows的代码,以不同方式传递输入文件(并放弃“getopt.h”依赖关系)?

右移C中的负数

我有C代码,我在其中执行以下操作。 int nPosVal = +0xFFFF; // + Added for ease of understanding int nNegVal = -0xFFFF; // – Added for valid reason 现在,当我尝试 printf (“%d %d”, nPosVal >> 1, nNegVal >> 1); 我明白了 32767 -32768 这是预期的吗? 我能够想到类似的东西 65535 >> 1 = (int) 32767.5 = 32767 -65535 >> 1 = (int) -32767.5 = -32768 也就是说,-32767.5四舍五入为-32768。 这种理解是否正确?

使用intptr_t而不是void *?

使用intptr_t作为通用存储(保存指针和整数值)而不是void*是一个好主意吗? (如下所示: http : //www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html ) 对于我已经读过的内容: int – > void* – > int roundtrip不保证保持原始值; 我猜int – > intptr_t – > int会做 void*和intptr_t上的指针算术需要强制转换,所以没有人在这里获得优势 void*表示存储指针时显式转换次数较少, intptr_t表示存储整数值时转换次数较少 intptr_t需要C99 还有什么我应该考虑的?

cat函数调用read()无限次

我正在研究简单的字符设备驱动程序。 我在模块中实现了读写function,问题是当我尝试使用cat /dev/devicefile读取设备文件时,它会进入无限循环,即重复读取相同的数据。 有人可以建议我解决这个问题吗? 以下是我的驱动程序代码。 #include #include #include #include #include MODULE_LICENSE(“GPL”); MODULE_DESCRIPTION(“character device driver”); MODULE_AUTHOR(“Srinivas”); static char msg[100]={0}; static int t; static int dev_open(struct inode *, struct file *); static int dev_rls(struct inode *, struct file *); static ssize_t dev_read(struct file *, char *,size_t, loff_t *); static ssize_t dev_write(struct file *, const char *, size_t,loff_t […]