Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。

3
用C定义字符串的细节是什么?
我应该为我的一个班回答一个家庭作业问题。具体来说,我应该说是否将C中的某些数组视为字符串。根据本文(https://www.geeksforgeeks.org/strings-in-c-2/),我知道字符串是一个字符数组,结尾是空终止符。 我的主要困扰是询问如下数组的问题: char c1[] = { 'C', 'S', '\0', '3', '2', '4', '\0' }; 显然这是一个字符数组,末尾有一个空终止符。但是,由于它的中间也有一个空终止符,它是否仍被认为是字符串?这将如何影响字符串? 编辑:根据评论,我提供了问题的实际措辞: “出于将它们用作strcpy(),strncpy(),strcmp(),strncmp()和类似的字符串函数(表示所有适用)的参数的目的,可以将以下哪些数组视为“字符串”?” 编辑:我给我的教授发了电子邮件,因为这个问题的措词似乎模棱两可(正如一些人指出的那样)。如果有人好奇,他告诉我“是的,它是一个字符串。关键是有一个空字符。但是,这当然会影响任何字符串操作;该字符串以空字符结尾。”

4
计算C中的嵌套根
我被要求仅使用递归来计算以下嵌套的根表达式。 我在下面编写了可行的代码,但他们只允许我们使用一个函数和1个输入n作为目的,而不是像我以前使用的2个。有人可以帮我将这段代码转换成一个可以计算表达式的函数吗?除了的功能,无法使用任何库<math.h>。 n = 10的输出: 1.757932 double rec_sqrt_series(int n, int m) { if (n <= 0) return 0; if (m > n) return 0; return sqrt(m + rec_sqrt_series(n, m + 1)); } double helper(int n) { return rec_sqrt_series(n, 1); }
9 c  recursion  sqrt 

1
C主要参数
我写了一个必须显示主要参数的代码,但是当我编译它并键入“ *”程序时,它显示了我的文件结构。cmd中的命令如下所示:program.exe 1 2 3 * #include <stdio.h> #include <stdlib.h> int main(int argc, char const* argv[]) { for (int i=0; i<argc; i++) printf("%s\n", argv[i]); return 0; } 结果是: program 1 2 3 program.c program.exe 10-03-20 11-02-20 我的问题是:是否可以强制程序打印“ *”而不是列出文件。谢谢建议

2
C中的const限定词和C ++中的const限定词有什么区别?
我找到了用户R.的评论: C和C ++语言不同。特别地,C const与C ++无关const。 我知道,constC中的const限定符和C ++中的限定符之间的区别是其默认链接。 const在C ++中,在命名空间范围内使用限定符声明的对象具有内部链接,而在C中,const在全局范围内声明带有限定符的对象(static在之前没有限定符const)具有外部链接。 但是在C和C ++语言之间,它们又有何不同?我认为两种语言在概念和目的上都具有相同的含义。 我的问题: C中的const限定词和C ++中的const限定词有什么区别? “ const”在C和C ++中有何不同的答案?不要在限定词的上下文中指出C和C ++语言之间的确切差异const。只有您不能或只能使用某种语言来做。

1
在不同的编译器上转换为void **
我一直在通过不同的编译器运行以下代码: int main() { float **a; void **b; b = a; } 从我已经能够收集,void **是不是一个普通的指针,这意味着从另一个指针任何转换不应该编译或至少抛出一个警告。但是,这是我的结果(全部在Windows上完成): gcc-如预期的那样发出警告。 g ++ -引发错误,如预期的那样(这是由于C ++的宽松输入造成的,对吧?) MSVC(cl.exe) -即使指定了/ Wall,也不会引发任何警告。 我的问题是:我是否遗漏了全部内容?是否有任何特定原因导致MSVC无法发出警告?MSVC 做转换时产生警告从 void **到float **。 还要注意的另一件事:如果我将其替换a = b为显式转换a = (void **)b,则所有编译器都不会发出警告。我认为这应该是无效的演员表,所以为什么不会有任何警告? 我问这个问题的原因是因为我开始学习CUDA并在官方编程指南(https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#device-memory)中学习可以找到以下代码: // Allocate vectors in device memory float* d_A; cudaMalloc(&d_A, size); 应该执行对void **for 的隐式转换&d_A,因为的第一个参数cudaMalloc是类型void **。在整个文档中都可以找到类似的代码。这只是NVIDIA的草率工作,还是我又错过了什么?由于nvcc使用MSVC,因此代码编译时不会发出警告。
9 c++  c  cuda 

1
防止进程在Linux上打开新的文件描述符,但允许通过套接字接收文件描述符
我目前在一个项目中,我有一个父进程来设置套接字对,派生然后使用此套接字对进行通信。子级如果要打开文件(或任何其他基于文件描述符的资源),应始终转到父级,请求资源并fd通过套接字对获取发送。此外,我想防止孩子自己打开任何文件描述符。 我偶然发现setrlimit哪个成功阻止了子进程打开新的文件描述符,但是这似乎也使通过初始套接字连接发送的任何文件描述符无效。Linux上是否有任何方法允许单个进程打开任何文件,将其文件描述符发送给其他进程并允许他们使用它们,而又不允许这些其他进程自己打开任何文件描述符? 对于我的用例,可以是任何内核配置,系统调用等,只要可以在fork之后应用,并且可以应用于所有文件描述符(不仅是文件,还可以是套接字,套接字对等)。
9 c  linux  system-calls 

1
指向不完整类型的指针可以不完整吗?
可以int (*)[]是不完整的类型吗? C 2018 6.2.5 1说: 在翻译单元内的各个点上,对象类型可能不完整(缺少足够的信息来确定该类型对象的大小)或完整(具有足够的信息)。 因此,似乎如果类型的大小已知,则该类型是完整的。6.2.6.1 28指定某些类型的指针必须具有相同的大小(指向void和的字符,指向兼容类型的指针,指向结构的指针以及指向联合的指针),但是指向其他类型的指针可能会有所不同。 在C实现中,所有指针或指向数组的所有指针 int都具有相同的大小,则int (*)[]已知的大小,因此将是完整的。例如,在对大型数组使用不同指针的实现中,大小是未知的,因此不完整。 作为MM指出,一个结构必须不包含不完全型的成员,在6.7.2.1 3.这表明与指针中的一个尺寸的实现必须接受除最终柔性阵列构件,每一个约束struct { int (*p)[]; }而一实现具有不同此类数组的大小必须诊断出约束违例。(这反过来意味着这样的声明不是严格符合C的一部分。)

3
LLVM为什么要分配冗余变量?
这是一个带有枚举定义和main函数的简单C文件: enum days {MON, TUE, WED, THU}; int main() { enum days d; d = WED; return 0; } 它会转换为以下LLVM IR: define dso_local i32 @main() #0 { %1 = alloca i32, align 4 %2 = alloca i32, align 4 store i32 0, i32* %1, align 4 store i32 2, i32* …
9 c  llvm  llvm-codegen 

1
CHAR_WIDTH未声明
‘CHAR_WIDTH’ undeclared 尝试编译此简单程序时出现错误 : #include <stdio.h> #include <limits.h> int main() { printf("CHAR_BIT = %d\n", CHAR_BIT); printf("CHAR_WIDTH = %d\n", CHAR_WIDTH); return (0); } 与 gcc ./show_char_width.c -o show_char_width 和gcc:由GNU C版本8.3.0,GMP版本6.1.2,MPFR版本4.0.2,MPC版本1.1.0编译的GNU C17(Ubuntu 8.3.0-6ubuntu1)版本8.3.0(x86_64-linux-gnu) ,isl版本isl-0.20-GMP,内核:5.0.0-37-generic。 如此处所述, CHAR_WIDTH应该在我的程序中包含的limits.h中定义。那么为什么我会收到此错误? 使用该-v选项,我发现将在这些目录中搜索该库: #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed /usr/include/x86_64-linux-gnu /usr/include …
9 c  gcc 

1
非常简单的代码中的“非法硬件指令”
在调查可疑的索赔时,我编写了这个小测试程序noway.c int proveit() { unsigned int n = 0; while (1) n++; return 0; } int main() { proveit(); return 0; } 测试一下,我得到: $ clang -O noway.c $ ./a.out zsh: illegal hardware instruction ./a.out 笏。 如果我不进行优化就进行编译,则它会按预期挂起。我看了看程序集,没有所有的花哨main功能,函数看起来像这样: _main: ## @main pushq %rbp movq %rsp, %rbp ud2 哪里 ud2显然是一个指令专门为未定义行为。前面提到的可疑声明“永不返回的函数是UB”得到了增强。我仍然很难相信。真!?您不能安全地编写自旋循环吗? 所以我想我的问题是: 这是对正在发生的事情的正确阅读吗? 如果是这样,有人可以指出我的官方资源吗? …

1
为什么在运行mandelbrot brainf ***程序时我的程序总是卡住?
我想提高自己的C语言技能,所以我搜索了一些程序的想法。 有人建议创建一个简单的Brainf ***解释器,然后创建一个编译器。所以我在这里。 我创建了解释器,并且按预期运行,但Mandelbrot程序除外: A mandelbrot set fractal viewer in brainfuck written by Erik Bosman +++++++++++++[->++>>>+++++>++>+<<<<<<]>>>>>++++++>--->>>>>>>>>>+++++++++++++++[[ >>>>>>>>>]+[<<<<<<<<<]>>>>>>>>>-]+[>>>>>>>>[-]>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>[-]+ <<<<<<<+++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>>+>>>>>>>>>>>>>>>>>>>>>>>>>> >+<<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+[>>>>>>[>>>>>>>[-]>>]<<<<<<<<<[<<<<<<<<<]>> >>>>>[-]+<<<<<<++++[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>+<<<<<<+++++++[-[->>> >>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>>+<<<<<<<<<<<<<<<<[<<<<<<<<<]>>>[[-]>>>>>>[>>>>> >>[-<<<<<<+>>>>>>]<<<<<<[->>>>>>+<<+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>> [>>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<+<<]>>>>>>>>]<<<<<<<<<[<<<<<<< <<]>>>>>>>[-<<<<<<<+>>>>>>>]<<<<<<<[->>>>>>>+<<+<<<<<]>>>>>>>>>+++++++++++++++[[ >>>>>>>>>]+>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[ >+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>[-<<<<+>>>>]<<<<[->>>>+<<<<<[->>[ -<<+>>]<<[->>+>>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<< <<[>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<< [>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<<<]<+<<<<<<<<<]>>>>> >>>>[>+>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+ <<<<<<[->>>[-<<<+>>>]<<<[->>>+>+<<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>> >>>>>>>]<<<<<<<<<[>>[->>>>>>>>>+<<<<<<<<<]<<<<<<<<<<<]>>[->>>>>>>>>+<<<<<<<<<]<< +>>>>>>>>]<<<<<<<<<[>[-]<->>>>[-<<<<+>[<->-<<<<<<+>>>>>>]<[->+<]>>>>]<<<[->>>+<< <]<+<<<<<<<<<]>>>>>>>>>[>>>>[-<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<+>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>>>]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>> >>>>>]<<<<<<<<<-<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+>>>>>>>>>>>>>>>>>>>>>+<<<[<<<<<< <<<]>>>>>>>>>[>>>[-<<<->>>]+<<<[->>>->[-<<<<+>>>>]<<<<[->>>>+<<<<<<<<<<<<<[<<<<< <<<<]>>>>[-]+>>>>>[>>>>>>>>>]>+<]]+>>>>[-<<<<->>>>]+<<<<[->>>>-<[-<<<+>>>]<<<[-> >>+<<<<<<<<<<<<[<<<<<<<<<]>>>[-]+>>>>>>[>>>>>>>>>]>[-]+<]]+>[-<[>>>>>>>>>]<<<<<< <<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]<<<<<<<[->+>>>-<<<<]>>>>>>>>>+++++++++++++++++++ +++++++>>[-<<<<+>>>>]<<<<[->>>>+<<[-]<<]>>[<<<<<<<+<[-<+>>>>+<<[-]]>[-<<[->+>>>- <<<<]>>>]>>>>>>>>>>>>>[>>[-]>[-]>[-]>>>>>]<<<<<<<<<[<<<<<<<<<]>>>[-]>>>>>>[>>>>> [-<<<<+>>>>]<<<<[->>>>+<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>>[-<<<<<<<< <+>>>>>>>>>]>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>+++++++++++++++[[>>>>>>>>>]+>[- ]>[-]>[-]>[-]>[-]>[-]>[-]>[-]>[-]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>-]+[>+>>>>>>>>]<<< <<<<<<[<<<<<<<<<]>>>>>>>>>[>->>>>>[-<<<<<+>>>>>]<<<<<[->>>>>+<<<<<<[->>[-<<+>>]< <[->>+>+<<<]+>>>>>>>>>]<<<<<<<<[<<<<<<<<<]]>>>>>>>>>[>>>>>>>>>]<<<<<<<<<[>[->>>> >>>>>+<<<<<<<<<]<<<<<<<<<<]>[->>>>>>>>>+<<<<<<<<<]<+>>>>>>>>]<<<<<<<<<[>[-]<->>> [-<<<+>[<->-<<<<<<<+>>>>>>>]<[->+<]>>>]<<[->>+<<]<+<<<<<<<<<]>>>>>>>>>[>>>>>>[-< <<<<+>>>>>]<<<<<[->>>>>+<<<<+<]>>>>>>>>]<<<<<<<<<[<<<<<<<<<]>>>>>>>>>[>+>>>>>>>> …

2
什么是C中的编译时封装?
当我研究C相对于C ++的优势时,遇到了这一段: 用C进行封装的标准方法是转发声明一个结构,并且仅允许通过函数访问其数据。此方法还会创建编译时封装。编译时封装使我们能够更改数据结构成员,而无需重新编译客户端代码(使用我们接口的其他代码)。另一方面,进行封装C ++的标准方法(使用类)要求在添加或删除私有成员变量时重新编译客户端代码。 我了解如何通过函数声明结构并访问其成员如何隐藏该结构的实现细节。我不明白的是这条线是: 编译时封装使我们能够更改数据结构成员,而无需重新编译客户端代码(使用我们接口的其他代码)。 在什么情况下适用?
9 c 

6
C指向按位和运算符的数组声明的指针
我想了解以下代码: //... #define _C 0x20 extern const char *_ctype_; //... __only_inline int iscntrl(int _c) { return (_c == -1 ? 0 : ((_ctype_ + 1)[(unsigned char)_c] & _C)); } 它源自obenbsd操作系统源代码中的文件ctype.h。此函数检查char是ascii范围内的控制字符还是可打印的字母。这是我目前的思路: 调用iscntrl('a')并将'a'转换为其整数值 首先检查_c是否为-1,然后返回0,否则... 将未定义指针指向的地址加1 声明此地址为长度数组的指针(unsigned char)((int)'a') 将按位和运算符应用于_C(0x20)和数组(???) 奇怪地,它以某种方式起作用,并且每次返回0时,给定的char _c都不是可打印字符。否则,当该函数可打印时,它只会返回一个没有特殊意义的整数值。我的理解问题在于第3步,第4步(有点)和第5步。 感谢您的任何帮助。
9 c  openbsd 

3
foo(void)与foo(void *)
从功能和语法上来说,原型为int foo(void)和的函数之间是否有区别int foo(void *)? 我知道,例如之间的差异,int bar(int)以及int bar(int *)-其中之一是寻找一个int,另一种是找一个int指针。void行为是否相同?

3
C中的+(+ k--)表达式
我在测试中看到了这个问题,在测试中我们必须告诉以下代码的输出。 #include<stdio.h> int main(){ int k = 0; while(+(+k--)!=0) k=k++; printf("%d\n", k); return 0; } 输出为-1。我不确定为什么会这样。 该表达式+(+k--)在C中是什么意思?
9 c 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.