Questions tagged «c»

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

6
如何在C程序中获取当前目录?
我正在制作一个C程序,需要在其中获取该程序的启动目录。该程序是为UNIX计算机编写的。我一直在看opendir()和telldir(),但是telldir()返回off_t (long int),所以它确实对我没有帮助。 如何获取字符串(char数组)中的当前路径?


3
为什么从字符串常量到'char *'的转换在C中有效但在C ++中无效
C ++ 11标准(ISO / IEC 14882:2011)在§ C.1.1: char* p = "abc"; // valid in C, invalid in C++ 对于C ++,因为指向字符串文字的指针是有害的,因为任何对其进行修改的尝试都将导致崩溃,这是有害的。但是为什么在C语言中有效呢? C ++ 11还说: char* p = (char*)"abc"; // OK: cast added 这意味着如果将强制类型转换添加到第一条语句中,它将变为有效。 为什么强制转换使第二条语句在C ++中有效,它与第一条语句有何不同?还是有害吗?如果是这样,为什么标准说没问题?
162 c++  c  string  c++11  char 

15
如何避免expr中的溢出。A B C D
我需要计算一个看起来像:的表达式 A*B - C*D,其类型为:signed long long int A, B, C, D; 每个数字都可以很大(不会溢出其类型)。虽然A*B可能导致溢出,但表达式A*B - C*D的确很小。如何正确计算? 例如:MAX * MAX - (MAX - 1) * (MAX + 1) == 1,其中MAX = LLONG_MAX - n和n-一些自然数。
161 c++  c  integer-overflow 

2
为什么在此C代码中将字母分成多个范围?
在一个自定义库中,我看到了一个实现: inline int is_upper_alpha(char chValue) { if (((chValue >= 'A') && (chValue <= 'I')) || ((chValue >= 'J') && (chValue <= 'R')) || ((chValue >= 'S') && (chValue <= 'Z'))) return 1; return 0; } 是复活节彩蛋,还是与标准C / C ++方法相比有什么优势? inline int is_upper_alpha(char chValue) { return ((chValue >= 'A') && (chValue …
161 c++  c  character  toupper 

8
字符串文字:它们去哪里了?
我对字符串文字在哪里分配/存储感兴趣。 我在这里确实找到了一个有趣的答案,说: 内联定义字符串实际上是将数据嵌入程序本身,并且不能更改(某些编译器通过巧妙的技巧允许这样做,不要打扰)。 但是,它与C ++有关,更不用说它不会打扰。 我很烦 = D 所以我的问题是我的字符串文字在哪里以及如何保存?为什么我不应该尝试更改它?实施因平台而异吗?是否有人愿意详细说明“智能技巧”?



14
Windows上最快的屏幕捕获方法
我想为Windows平台编写一个截屏程序,但是不确定如何捕获屏幕。我知道的唯一方法是使用GDI,但我很好奇是否还有其他方法可以解决此问题,如果有的话,哪种方法开销最少?速度是重中之重。 该截屏节目将用于记录游戏画面,但是,如果这确实缩小了选项的范围,我仍然愿意接受不属于此范围的任何其他建议。毕竟,知识还不错。 编辑:我碰到了这篇文章:各种捕获屏幕的方法。它向我介绍了Windows Media API的实现方式和DirectX的实现方式。它在结论中提到禁用硬件加速可以大大提高捕获应用程序的性能。我很好奇为什么会这样。谁能为我填补缺失的空白? 编辑:我读过诸如Camtasia之类的截屏程序使用它们自己的捕获驱动程序。有人可以详细解释它的工作原理以及为什么它更快。我可能还需要有关实现类似内容的指导,但是我确信无论如何都存在现有文档。 另外,我现在知道FRAPS如何记录屏幕。它挂接底层图形API以从后缓冲区读取。据我了解,这比从前端缓冲区读取要快,因为您正在从系统RAM而不是视频RAM进行读取。您可以在这里阅读文章。
159 c++  c  windows 

13
“在编译时分配的内存”的真正含义是什么?
在像C和C ++这样的编程语言中,人们经常引用静态和动态内存分配。我理解这个概念,但是“在编译时分配(保留)所有内存”这句话总是让我感到困惑。 据我了解,编译将高级C / C ++代码转换为机器语言并输出可执行文件。如何在已编译文件中“分配”内存?难道不是所有虚拟内存管理工具都总是在RAM中分配内存吗? 按照定义,内存分配不是运行时的概念吗? 如果我在C / C ++代码中创建一个1KB的静态分配变量,这将使可执行文件的大小增加相同的数量吗? 这是在“静态分配”标题下使用该短语的页面之一。 返璞归真:内存分配,回顾历史

14
升级到Mojave后,无法在Mac上编译C程序
我已经在终端上使用gcc命令来编译C程序,但是突然之间,在更新Mac操作系统(至macOS 10.14 Mojave和XCode 10.0)之后,我开始收到消息: test.c:8:10: fatal error: stdio.h: No such file or directory #include <stdio.h> ^~~~~~~~~ compilation terminated. 我已经安装了gcc,因为可以在/usr/local/bin其中找到它,并且确实有一个gcc。我尝试在其他iMac上运行相同的文件,但没有任何问题。 我尝试运行xcode-select --install并已经安装,因此无法解决我现在遇到的问题。我猜测该路径是混乱的,因为gcc在我开始复制并粘贴来自其他资源的一些命令来解决此问题后似乎找不到该路径。 希望对此有所帮助。
159 c  macos  gcc  terminal 

1
为什么“ The C Programming Language”这本书说我必须转换malloc?
今天,我到达了C编程语言(第二版Brian W. Kernighan和Dennis M. Ritchie)的第167页,发现作者说我必须强制转换。这是本书的一部分:malloc 7.8.5存储管理 函数malloc和calloc动态获取内存块。 void *malloc(size_t n) 返回一个指向n字节未初始化存储的指针,如果无法满足请求,则返回NULL。 void *calloc(size_t n, size_t size) 返回一个指向足够的可用空间的指针,该指针用于指定大小的n个对象的数组;如果无法满足请求,则返回NULL。存储初始化为零。由malloc或calloc返回的指针与所讨论的对象具有正确的对齐方式,但必须将其强制转换为适当的类型,如 int *ip; ip = (int *) calloc(n, sizeof(int)); 我已经知道malloc(及其家族)返回类型void *,并且有很好的解释为什么不强制转换malloc。 但是我的问题是:为什么这本书说我应该抛弃它?

3
函数声明不是原型
我有一个我创建的图书馆 mylib.c: #include <mylib.h> int testlib() { printf("Hello world\n"); return (0); } mylib.h: #include <stdio.h> extern int testlib(); 在我的程序中,我尝试调用此库函数: myprogram.c: #include <mylib.h> int main (int argc, char *argv[]) { testlib(); return (0); } 当我尝试编译该程序时,出现以下错误: 在myprogram.c中包含的文件中:1 mylib.h:2警告:函数声明不是原型 我正在使用: gcc (GCC) 3.4.5 20051201 (Red Hat 3.4.5-2) 我的问题是,声明函数原型的正确方法是什么?
158 c  gcc 


9
为什么从非空函数的末尾流出而不返回值不会产生编译器错误?
自从我多年前意识到,默认情况下不会产生错误(至少在GCC中),我一直想知道为什么? 我知道您可以发出编译器标志来产生警告,但是它不总是错误吗?对于非void函数不返回有效值,为什么有意义? 评论中要求的示例: #include <stdio.h> int stringSize() { } int main() { char cstring[5]; printf( "the last char is: %c\n", cstring[stringSize()-1] ); return 0; } ...编译。
158 c++  c  gcc  g++ 

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.