Questions tagged «c»

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

4
PTHREAD_MUTEX_INITIALIZER与pthread_mutex_init(&mutex,param)
之间有什么区别 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 要么 pthread_mutex_t lock; pthread_mutex_init ( &lock, NULL); 如果仅使用第一种方法,我是否足够安全? 注意:我的问题主要涉及非常小的程序,在这些程序中,我最多要做的是将多个客户端连接到服务器,并使用辅助线程解决其查询。
89 c  ubuntu  pthreads  mutex 



4
GDB:如果变量等于值则中断
当变量等于我设置的某个值时,我想让GDB设置一个断点,我尝试了以下示例: #include <stdio.h> main() { int i = 0; for(i=0;i<7;++i) printf("%d\n", i); return 0; } GDB的输出: (gdb) break if ((int)i == 5) No default breakpoint address now. (gdb) run Starting program: /home/SIFE/run 0 1 2 3 4 5 6 Program exited normally. (gdb) 如您所见,GDB没有任何断点,GDB是否可以做到这一点?
89 c  gdb 

4
“易失性”的定义是易失性的,还是GCC存在一些标准合规性问题?
我需要一个函数(例如WinAPI中的SecureZeroMemory)始终将内存归零,并且不会被优化,即使编译器认为此后再也不会访问内存了。似乎是挥发物的理想选择。但是我在将其与GCC一起使用时遇到了一些问题。这是一个示例函数: void volatileZeroMemory(volatile void* ptr, unsigned long long size) { volatile unsigned char* bytePtr = (volatile unsigned char*)ptr; while (size--) { *bytePtr++ = 0; } } 很简单。但是,如果您调用GCC实际生成的代码,则随着编译器版本以及您实际上试图将其设置为零的字节数而大不相同。https://godbolt.org/g/cMaQm2 GCC 4.4.7和4.5.3永远不会忽略挥发物。 对于数组大小1、2和4,GCC 4.6.4和4.7.3忽略了volatile。 GCC 4.8.1至4.9.2会忽略数组大小1和2的volatile。 GCC 5.1直到5.3会忽略数组大小1、2、4、8的volatile 对于任何数组大小(一致性的加分点),GCC 6.1都将忽略它。 我测试过的任何其他编译器(clang,icc,vc)都可以生成期望的存储,并且具有任何编译器版本和任何数组大小。所以在这一点上,我想知道,这是一个(相当老而严重的)GCC编译器错误,还是该标准中的volatile定义不精确地表明这实际上是符合规范的行为,因此根本不可能编写可移植的“ SecureZeroMemory”功能? 编辑:一些有趣的观察。 #include <cstddef> #include <cstdint> #include <cstring> #include <atomic> void callMeMaybe(char* …
89 c++  c  gcc  standards 

3
线程安全与可重入
最近,我问了一个问题,标题为“ malloc线程安全吗?” ,然后在里面问:“ malloc是否可重入?” 我的印象是所有重入者都是线程安全的。 这个假设错了吗?

9
如何在C中使用nan和inf?
我有一个数值方法,如果出现错误,可以返回nan或inf,出于测试目的,我想暂时强制它返回nan或inf,以确保正确处理情况。是否存在可靠的,独立于编译器的方法来在C中创建nan和inf的值? 谷歌搜索大约10分钟后,我只能找到依赖编译器的解决方案。
89 c  math 

2
什么是vdso和vsyscall?
我做了 sudo cat /proc/1/maps -vv 我试图弄清楚输出,可以看到很多共享库都按预期映射到了内存映射段。 7f3c00137000-7f3c00179000 r-xp 00000000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00179000-7f3c00379000 ---p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c00379000-7f3c0037a000 r--p 00042000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037a000-7f3c0037b000 rw-p 00043000 08:01 21233923 /lib/x86_64-linux-gnu/libdbus-1.so.3.5.8 7f3c0037b000-7f3c00383000 r-xp 00000000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00383000-7f3c00583000 ---p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00583000-7f3c00584000 r--p 00008000 08:01 21237216 /lib/x86_64-linux-gnu/libnih-dbus.so.1.0.0 7f3c00584000-7f3c00585000 rw-p …
89 c  linux  linux-kernel  kernel  vdso 

10
const和const volatile之间的区别
如果我们在volatile每次更新新值时都 声明一个变量,如果我们声明一个变量,const则该变量的值将保持不变 那么,如上所述const volatile int temp; 声明变量temp有什么用? 如果声明为,会发生什么const int temp?
89 c  embedded 


10
CMake无法使用C ++确定链接器语言
我试图同时在Windows 7 x64和Visual Studio 2010和Cygwin上运行cmake hello world程序,但似乎都无法正常工作。我的目录结构如下: HelloWorld -- CMakeLists.txt -- src/ -- -- CMakeLists.txt -- -- main.cpp -- build/ 我先执行,cd build然后执行cmake ..,并收到一条错误消息,指出 CMake Error: CMake can not determine linker language for target:helloworld CMake Error: Cannot determine link language for target "helloworld". 但是,如果我将filsystem和src/CMakeLists.txt所有正常工作的main.cpp扩展名更改为main.c。从Visual Studio命令提示符(Visual Studio解决方案生成器)和Cygwin终端(Unix Makefiles生成器)运行都是这种情况。 知道为什么这段代码行不通吗? CMakeLists.txt PROJECT(HelloWorld C) …
89 c++  c  cmake 

9
为什么A +++++ b不起作用?
int main () { int a = 5,b = 2; printf("%d",a+++++b); return 0; } 此代码给出以下错误: 错误:需要左值作为增量操作数 但是,如果我在a++ +和之间放置空格++b,则效果很好。 int main () { int a = 5,b = 2; printf("%d",a++ + ++b); return 0; } 该错误在第一个示例中意味着什么?
88 c  lvalue 

13
该程序如何工作?
#include <stdio.h> int main() { float a = 1234.5f; printf("%d\n", a); return 0; } 它显示一个0!! 那怎么可能?这是什么原因? 我故意%d在printf声明中加入,以研究的行为printf。
88 c++  c  memory  printf  endianness 

7
Linux内核如何进行自身编译?
在计算机上安装Linux系统时,我不太了解Linux内核的编译过程。 以下是使我感到困惑的一些事情: 内核是用C编写的,但是如何在不安装编译器的情况下编译内核? 如果在编译内核之前在我的机器上安装了C编译器,那么在没有安装编译器的情况下如何编译该编译器本身? 几天来我都很困惑,感谢您的回复。

8
搜索元素的有效方法
最近我接受了一次采访,他们问我一个“ 搜索 ”问题。 问题是: 假设有一个(正)整数数组,每个元素都是+1或-1与其相邻元素比较。 例: array = [4,5,6,5,4,3,2,3,4,5,6,7,8]; 现在搜索7并返回其位置。 我给了这个答案: 将值存储在临时数组中,对其进行排序,然后应用二进制搜索。 如果找到该元素,则返回其在临时数组中的位置。 (如果数字出现两次,则返回其第一次出现) 但是,他们似乎对此答案并不满意。 正确的答案是什么?

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.