Questions tagged «c»

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



3
Mmap()整个大文件
我试图使用以下代码(test.c)“映射”一个二进制文件(〜8Gb)。 #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { const char *memblock; int fd; struct stat sb; fd = open(argv[1], O_RDONLY); fstat(fd, &sb); printf("Size: %lu\n", (uint64_t)sb.st_size); memblock = …
69 c  mmap 

8
在C中使用strict关键字的规则?
我试图了解何时以及何时不使用 restrictC中关键字,以及在什么情况下它提供了明显的好处。 阅读了“ Demystifying The Restrict Keyword ”(提供了一些使用经验的规则)后,我得到的印象是,当函数传递指针时,它必须考虑所指向的数据可能重叠的可能性(别名)并将任何其他参数传递到函数中。给定一个功能: foo(int *a, int *b, int *c, int n) { for (int i = 0; i<n; ++i) { b[i] = b[i] + c[i]; a[i] = a[i] + b[i] * c[i]; } } 编译器必须c在第二个表达式中重新加载,因为也许b并c指向同一位置。由于相同的原因,它还必须等待b存储后才能加载a。然后,它必须等待a存储和必须重新加载b,并c在下一循环的开始。如果您像这样调用函数: int a[N]; foo(a, a, a, N); 然后您会看到编译器为什么必须这样做。restrict有效使用会告诉编译器您永远都不会这样做,因此它可以删除存储的冗余负载c和a之前的负载b。 在另一篇SO文章中,Nils Pipenbrinck提供了此方案的一个有效示例,展示了性能优势。 到目前为止,我已经收集到,使用它是一个好主意 …
69 c  optimization  memory 

13
NULL是否总是假?
是否可以安全地假设NULL在C语言中始终将其转换为false? void *somePtr = NULL; if (!somePtr) { /* This will always be executed? */ } 还是应该明确检查其价值NULL?
69 c  null  pointers 


4
函数是否是现代平台的有效内存屏障?
在我审阅的代码库中,我发现了以下成语。 void notify(struct actor_t act) { write(act.pipe, "M", 1); } // thread A sending data to thread B void send(byte *data) { global.data = data; notify(threadB); } // in thread B event loop read(this.sock, &cmd, 1); switch (cmd) { case 'M': use_data(global.data);break; ... } 我对我的团队的资深成员对作者说:“保存”,这里没有内存屏障!您不保证global.data将其从缓存刷新到主内存。如果线程A和线程B将在其中运行两个不同的处理器-此方案可能会失败”。 高级程序员咧嘴笑着,慢慢地解释,好像在解释他的五岁男孩如何系鞋带:“听小男孩,在高负载测试和实际客户中,我们在这里看到了许多与线程相关的错误”,他停下来挠挠他长长的胡须,“但是这个习语从来没有犯过错误”。 “但是,它在书中说……” “安静!”他迅速向我嘘声,“也许从理论上讲不能保证,但实际上,您使用函数调用的事实实际上是内存障碍。编译器不会对指令进行重新排序global.data = data,因为它不知道是否任何在函数调用中使用它的人,x86架构将确保在线程B从管道读取命令时其他CPU将看到此全局数据,请放心,我们有很多现实问题需要担心。我们不需要在虚假的理论问题上投入额外的精力。 …


9
C编程:另一个函数内的malloc()
我需要malloc() 其他功能的帮助。 我正在从我的函数传递一个指针和一个大小给函数main(),我想malloc()从被调用的函数内部使用该指针动态分配内存,但是我看到的是...正在分配的内存是用于在我的调用函数中声明的指针,而不用于main()。 我该如何传递指向函数的指针并从被调用函数内部为传递的指针分配内存? 我编写了以下代码,并得到如下所示的输出。 资源: int main() { unsigned char *input_image; unsigned int bmp_image_size = 262144; if(alloc_pixels(input_image, bmp_image_size)==NULL) printf("\nPoint2: Memory allocated: %d bytes",_msize(input_image)); else printf("\nPoint3: Memory not allocated"); return 0; } signed char alloc_pixels(unsigned char *ptr, unsigned int size) { signed char status = NO_ERROR; ptr = NULL; ptr …
69 c  function  pointers  malloc 


4
Pthreads与OpenMP
我正在使用Linux在C中创建一个多线程应用程序。 我不确定应该使用POSIX线程API还是OpenMP API。 使用这两种方法的利弊是什么? 编辑: 有人可以澄清这两个API是创建内核级线程还是用户级线程?
69 c  pthreads  openmp 


3
在Linux中获取主目录
我需要一种在Linux上运行的C ++程序中获取用户主目录的方法。如果相同的代码可以在Unix上运行,那就太好了。我不想使用HOME环境值。 AFAIK,根主目录是/ root。如果我的程序由root用户运行,可以在此目录中创建一些文件/文件夹吗?
69 c++  c  linux 

11
遇到C的常见未定义/未指定行为是什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 7年前关闭。 改善这个问题 C语言中未指定行为的一个示例是对函数自变量的求值顺序。您可能不知道它可能是从左到右或从右到左。这将如何影响foo(c++, c)或foo(++c, c)获取评估。 还有哪些其他未说明的行为可能会使无意识的程序员感到惊讶?

14
在C中寻找良好的哈希表实现[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow的主题。 7年前关闭。 改善这个问题 我主要对字符串键感兴趣。有人可以将我指向图书馆吗?
68 c  string  hashtable  hash 

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.