Questions tagged «c»

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

4
C标准库和C POSIX库之间的区别
我对“ C标准库”和“ C POSIX库”感到有些困惑,因为我发现,“ C POSIX库”中定义的许多头文件也是“ C标准库”的一部分。 因此,我假设“ C standard lib”是由ANSI C组织定义的库,并且在不同平台(类似于Win32 / Unix)上有不同的实现,而“ C POSIX lib”只是“ C standard的实现”类Unix操作系统上的“ lib”,对吗? 但是“C POSIX LIB”包含了一些头在“C标准库”未指定,如<sys/types.h>,<sys/wait.h>和<pthread.h>。 以<pthread.h>为例,我相信它的“C标准库”对应的是<threads.h>,那么如果我想要写在Linux上,这头文件,我应该包括,多线程程序<pthread.h>或<threads.h>?

2
未定义对`std :: ios_base :: Init :: Init()的引用
我编写这段代码来读取3个文件,TM是方阵的大小,LER是数组的行数,从最后一个值开始定义(ler / 2)* 2的非方阵 然后...代码读取了具有一定关系的文件,所有文件均为数字,并分配给C [ler]。 然后... C [ler]被分配给B [ler / 2] [2]。 B [ler / 2] [2]中每行的那些坐标将分配给a和b。 a和b是矩阵A [tm] [tm]的行和列,要加1。 我的代码崩溃了,我看不到错误是什么。 当我尝试编译它时,编译器gcc -g -o MatSim MatSim.cpp会提示: /usr/include/c++/4.6/iostream:75: undefined reference to `std::ios_base::Init::Init()' /usr/include/c++/4.6/iostream:75: undefined reference to `std::ios_base::Init::~Init()' collect2: ld returned 1 exit status 另外,当我尝试编译它时,编译器f77 -o MatSim MatSim.cpp会提示: /tmp/cc6ewlkf.o: In function …
73 c  matrix  coredump 

2
指针指向的int的增量值
我有一个int指针(即int *count),我想通过使用++运算符来增加所指向的整数。我以为我会打电话给: *count++; 但是,我得到了一个构建警告“表达式结果未使用”。我可以打电话 *count += 1; 但是,我也想知道如何使用++运算符。有任何想法吗?

8
在运行时允许数组大小而不进行动态分配吗?
我已经使用C ++几年了,今天我看到了一些代码,但是这怎么完全合法呢? int main(int argc, char **argv) { size_t size; cin >> size; int array[size]; for(size_t i = 0; i < size; i++) { array[i] = i; cout << i << endl; } return 0; } 在GCC下编译。 没有new或malloc如何在运行时确定大小? 只是仔细检查一下,我已经在Google上搜索了一些和所有与我类似的代码,声称它们会导致存储大小错误。 甚至Deitel的C ++如何编程p。常见编程错误4.5下的261个状态: 仅常量可用于声明自动和静态数组的大小。 开导我

15
何时在C中使用位域?
关于“我们为什么需要使用位域”这个问题,在Google上搜索时,我发现位域用于标志。现在我很好奇 这是实际使用位域的唯一方法吗? 我们是否需要使用位字段来节省空间? 从书中定义位域的方式: struct { unsigned int is_keyword : 1; unsigned int is_extern : 1; unsigned int is_static : 1; } flags; 我们为什么要使用int? 占用多少空间? 我很困惑为什么我们使用了int,但是没有使用short或比的小int。 据我了解,内存中仅占用1位,而不是整个unsigned int值。这是对的吗?
73 c 


3
为什么gcc中'-l'选项的顺序很重要?[重复]
这个问题已经在这里有了答案: 为什么链接库的顺序有时会导致GCC错误? (9个答案) 上个月关闭。 我正在尝试编译一个使用udis86库的程序。实际上,我正在使用库用户手册中给出的示例程序。但是在编译时会产生错误。我得到的错误是: example.c:(.text+0x7): undefined reference to 'ud_init' example.c:(.text+0x7): undefined reference to 'ud_set_input_file' . . example.c:(.text+0x7): undefined reference to 'ud_insn_asm' 我正在使用的命令是: $ gcc -ludis86 example.c -o example 按照用户手册中的指示。 显然,链接器无法链接libudis库。但是,如果我将命令更改为: $ gcc example.c -ludis86 -o example 它开始工作。因此,请有人解释第一个命令的问题是什么?
72 c  gcc  linker  ld 

7
goto标签后的变量声明
今天我发现了一件事。我不知道在goto标签后不能声明变量。 编译以下代码 #include <stdio.h> int main() { int x = 5; goto JUMP; printf("x is : %d\n",x); JUMP: int a = 0; <=== giving me all sorts of error.. printf("%d",a); } 给出类似的错误 temp.c: In function ‘main’: temp.c:7: error: expected expression before ‘int’ temp.c:8: error: ‘a’ undeclared (first use in this …

8
L1高速缓存未命中的成本是多少?
编辑:出于参考目的(如果有人偶然发现此问题),Igor Ostrovsky写了一篇有关缓存未命中的好文章。它讨论了几个不同的问题并显示了示例编号。 结束编辑 我做了一些测试,<long story goes here>并且想知道性能差异是否是由于内存缓存未命中引起的。以下代码演示了该问题,并将其归结为关键的计时部分。以下代码具有几个循环,这些循环以随机顺序访问内存,然后以地址升序访问。 我在XP机器(与VS2005编译:cl / O2)和Linux机器(gcc –Os)上运行了它。两者产生相似的时间。这些时间以毫秒为单位。我相信所有循环都在运行,并且没有进行优化(否则它将“立即”运行)。 ***测试20000个节点 总订购时间:888.822899 总随机时间:2155.846268 这些数字有意义吗?差异主要是由于L1高速缓存未命中还是其他原因造成的?有20,000 ^ 2个内存访问,如果每个访问都是缓存未命中,则每个未命中大约3.2纳秒。我测试过的XP(P4)机器为3.2GHz,我怀疑(但不知道)具有32KB L1高速缓存和512KB L2。假设有20,000个条目(80KB),我认为不会有大量的L2丢失。原来如此(3.2*10^9 cycles/second) * 3.2*10^-9 seconds/miss) = 10.1 cycles/miss。在我看来,这太高了。也许不是,或者我的数学不好。我尝试使用VTune测量高速缓存未命中,但是出现了BSOD。现在,我无法连接到许可证服务器(grrrr)。 typedef struct stItem { long lData; //char acPad[20]; } LIST_NODE; #if defined( WIN32 ) void StartTimer( LONGLONG *pt1 ) { QueryPerformanceCounter( (LARGE_INTEGER*)pt1 ); } …

9
内置类型的性能:char,short,int,float,double
这似乎是一个愚蠢的问题,但是看到Alexandre C在另一个主题中的答复,我很好奇知道内置类型是否存在性能差异: charVS shortVSint主场迎战float 主场迎战double。 通常我们在现实生活项目中不会考虑这种性能差异(如果有的话),但是出于教育目的,我想知道这一点。可以问的一般问题是: 积分算术和浮点算术之间是否有性能差异? 哪个更快?更快的原因是什么?请解释一下。
72 c++  c  performance  built-in 

4
Linux内核:系统调用挂钩示例
我正在尝试编写一些简单的测试代码,以作为钩住系统调用表的演示。 “ sys_call_table”在2.6中不再导出,因此我只是从System.map文件中获取地址,我可以看到它是正确的(在内存中查找我找到的地址,我可以看到指向该地址的指针系统调用)。 但是,当我尝试修改该表时,内核会给“ Oops”加上“无法处理虚拟地址c061e4f4上的内核分页请求”,然后机器会重新启动。 这是运行2.6.18-164.10.1.el5的CentOS 5.4。有某种保护措施还是我只有一个bug?我知道SELinux附带了它,我已经尝试过将其设置为宽松模式,但这并没有什么不同 这是我的代码: #include <linux/kernel.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/unistd.h> void **sys_call_table; asmlinkage int (*original_call) (const char*, int, int); asmlinkage int our_sys_open(const char* file, int flags, int mode) { printk("A file was opened\n"); return original_call(file, flags, mode); } int init_module() { // sys_call_table address …
72 c  linux-kernel  hook 


9
如何防止GCC优化繁忙的等待循环?
我想为Atmel AVR微控制器编写C代码固件。我将使用GCC进行编译。另外,我想启用编译器优化(-Os或-O2),因为我没有理由不启用它们,并且它们可能比手动编写程序集更快地产生更好的组装方式。 但是我想要一小段未优化的代码。我想将函数的执行延迟一段时间,因此我想编写一个空循环,以浪费时间。无需精确,只需等待一段时间。 /* How to NOT optimize this, while optimizing other code? */ unsigned char i, j; j = 0; while(--j) { i = 0; while(--i); } 由于AVR内存访问是慢了很多,我想i和j被关在CPU寄存器。 更新:我刚刚从AVR Libc中找到util / delay.h和util / delay_basic.h。尽管大多数时候使用这些功能可能是一个更好的主意,但这个问题仍然有效且有趣。 相关问题: 如何防止gcc在C语言中优化某些语句? 有没有办法告诉GCC不要优化特定代码? 如何不优化-愚蠢功能的机制
72 c  optimization  gcc  avr-gcc 

4
为什么要使用MACRO + 0!= 0
在当前的代码库中,我看到以下模式: #if SOMETHING_SUPPORTED+0 != 0 ... #endif 不幸的是,这是一个非常古老的代码库,没人知道它是如何开始的。我认为它始于C,后来随着类逐渐转换为C,现在趋向于C ++ 我看不到使用以前的构造而不是“经典”的任何明显优势,但是也许我缺少了一些东西: #if SOMETHING_SUPPORTED ... #endif 你知道为什么要用一个#if MACRO+0 != 0代替#if MACRO吗?
72 c++  c 

5
在C / C ++中进行无符号左移之前的掩盖是否过于偏执?
这个问题的动机是由我在C / C ++中实现加密算法(例如SHA-1),编写与平台无关的可移植代码以及彻底避免未定义的行为引起的。 假设标准的加密算法要求您实现此目的: b = (a << 31) & 0xFFFFFFFF 其中a和b是无符号的32位整数。注意,在结果中,我们丢弃了最低有效32位以上的任何位。 作为第一个幼稚的近似值,我们可以假设int在大多数平台上该宽度为32位,因此我们可以这样写: unsigned int a = (...); unsigned int b = a << 31; 我们知道该代码不会在任何地方都起作用,因为int在某些系统上为16位宽,在其他系统上为64位,甚至可能为36位。但是使用stdint.h,我们可以使用以下uint32_t类型来改进此代码: uint32_t a = (...); uint32_t b = a << 31; 这样我们就完成了,对吧?这就是我多年以来的想法。... 不完全的。假设在某个平台上,我们有: // stdint.h typedef unsigned short uint32_t; 在C / C ++中执行算术运算的规则是,如果类型(例如short)比窄int,则将其扩展到int所有值都适合的范围,unsigned int否则。 …

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.