Questions tagged «c»

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

29
测试指针的有效性(C / C ++)
有什么方法可以(当然,通过编程)确定给定的指针是否“有效”?检查NULL很容易,但是0x00001234之类的东西呢?尝试取消引用此类指针时,会发生异常/崩溃。 最好使用跨平台方法,但也可以使用特定于平台的方法(对于Windows和Linux)。 更新说明: 问题不是陈旧/已释放/未初始化的指针;相反,我正在实现一个API,该API接收来自调用者的指针(例如,指向字符串的指针,文件句柄等)。调用者可以发送(有意或无意)无效值作为指针。如何防止车祸?
90 c++  c  validation  pointers  null 

1
使用Linux命令将十六进制信息转换为二进制
我的Linux系统上有这个二进制文件... udit@udit-Dabba ~ $ cat file.enc Salted__s�bO��<0�F���Jw!���]�:`C�LKȆ�l 使用hexdump命令,我可以看到如下信息: udit@udit-Dabba ~ $ hexdump -C file.enc 00000000 53 61 6c 74 65 64 5f 5f 1b 73 a1 62 4f 15 be f6 |Salted__.s.bO...| 00000010 3c 30 cc 46 ee 10 13 11 84 bf 4a 77 21 a4 84 99 |<0.F......Jw!...| …


5
gdb:“未加载任何符号表”
尝试在gdb中添加断点时,我不断收到此错误消息。 我使用以下命令进行编译: gcc -g main.c utmpib2.c -o main.o and: cc -g main.c utmpib2.c -o main.o and also: g++ -g main.c utmpib2.c -o main.o 我也尝试使用“ -ggdb”而不是“ -g”,但仍然收到该错误消息。 然后执行gdb: $gdb 在gdb中: (gdb)exec-file main.o (gdb)break 59 No symbol table is loaded. Use the "file" command.
90 c  gdb 

3
使用C预处理器将int连接到字符串
我试图弄清楚如何使用C预处理器将#define'd int串联为#define'd字符串。我的编译器是CentOS 5上的GCC 4.1。该解决方案也应适用于MinGW。 我想在字符串上附加一个版本号,但是唯一可以使它起作用的方法是将版本号的副本定义为字符串。 我能找到的最接近的东西是引用宏参数的方法,但不适用于#defines 这是行不通的。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER 它不没有工作,#小号或者是因为值为数字,它会扩大到"/home/user/.myapp" 2 6,这是无效的Ç。 确实可以,但是我不喜欢定义版本的副本,因为我确实也需要它们作为数字。 #define MAJOR_VER 2 #define MINOR_VER 6 #define MAJOR_VER_STR "2" #define MINOR_VER_STR "6" #define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING


7
将2D数组映射到1D数组
我想用1D数组表示2D数组。函数将传递两个索引(x,y)和要存储的值。这两个标记将代表一维数组的单个元素,并进行相应设置。我知道一维数组需要具有arrayWidth×arrayHeight的大小,但是我不知道如何设置每个元素。 例如,如何区分(2,4,3)与(4,2,3)?我尝试将数组设置为x * y,但是2 * 4和4 * 2会在数组中产生相同的斑点,我需要它们有所不同。

4
从C ++代码调用C函数
我有一个想从C ++调用的C函数。我无法使用“ extern "C" void foo()”这样的方法,因为C函数无法使用g ++进行编译。但是使用gcc可以很好地编译。有什么想法如何从C ++调用函数吗?
90 c++  c  linux  extern-c 

7
什么是无符号数据类型?
我见过这种unsigned“无类型”类型使用过几次,但从未见过对此的解释。我想有一个对应的signed类型。这是一个例子: static unsigned long next = 1; /* RAND_MAX assumed to be 32767 */ int myrand(void) { next = next * 1103515245 + 12345; return((unsigned)(next/65536) % 32768); } void mysrand(unsigned seed) { next = seed; } 到目前为止,我已经收集了以下内容: -在我的系统上sizeof(unsigned) = 4((32位无符号int的提示) -它可以用作将另一种类型转换为无符号版本的简写: signed long int i = -42; printf("%u\n", (unsigned)i); 这是ANSI …
90 c  types  unsigned 

5
GCC致命错误:stdio.h:没有这样的文件或目录
我正在尝试使用GCC 4.9(实验性)在OS X 10.9上的C语言中编译程序。出于某种原因,在编译时出现以下错误: gcc: fatal error: stdio.h: No such file or directory 然后,我尝试了一个简单的Hello World程序: #include <stdio.h> int main(int argc, const char *argv[]) { printf("Hello, world!"); return 0; } 同样,在运行时gcc -o ~/hello ~/hello.c,我遇到了同样的错误。我正在使用的实验版本gcc,但是似乎不可能发行一个在导入时产生错误的版本stdio。是什么导致此问题,如何解决?
90 c  gcc  stdio 

4
执行HTTP POST并使用响应的简单C示例
我想创建一个执行HTTP发布的非常简单的C应用程序。这将需要一些参数,并使用这些参数来构造URL。我只想做一个简单的HTTP POST并获得不使用curl的响应(这些库不会也不会安装在需要运行的机器上)。 伪代码: 进程2参数 将args放入模板URL:http : //api.somesite.com/apikey=ARG1&command=ARG2 在生成的网址上发布 消耗响应 我的Google和SO搜索对此没有任何帮助。
90 c  http  http-post 

6
与其他类型的循环相比,编译器会为do-while循环产生更好的代码吗?
zlib压缩库中有一条注释(Chromium项目中使用了它),这意味着在大多数编译器中,C语言中的do-while循环会生成“更好的”代码。这是它所在的代码段。 do { } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && *(ushf*)(scan+=2) == *(ushf*)(match+=2) && scan < strend); /* The funny "do {}" generates better code on most compilers */ https://code.google.com/p/chromium/codesearch#chromium/src/third_party/zlib/deflate.c&l=1225 是否有证据表明大多数(或任何一种)编译器会生成更好(例如,效率更高)的代码? 更新: 原始作者之一Mark Adler在评论中提供了一些上下文。

8
获取终端宽度在C?
我一直在寻找一种从C程序中获取终端宽度的方法。我不断提出的思路是: #include <sys/ioctl.h> #include <stdio.h> int main (void) { struct ttysize ts; ioctl(0, TIOCGSIZE, &ts); printf ("lines %d\n", ts.ts_lines); printf ("columns %d\n", ts.ts_cols); } 但是每次我尝试得到 austin@:~$ gcc test.c -o test test.c: In function ‘main’: test.c:6: error: storage size of ‘ts’ isn’t known test.c:7: error: ‘TIOCGSIZE’ undeclared (first use in this …
89 c  linux  terminal  width 

4
为什么memmove比memcpy快?
我正在研究某个应用程序中的性能热点,该应用程序将其50%的时间都花在memmove(3)上。该应用程序将数百万个4字节的整数插入已排序的数组中,并使用memmove将数据“右移”,以便为插入的值腾出空间。 我的期望是复制内存的速度非常快,而令我惊讶的是花了这么多时间在记忆体上。但是后来我想到memmove速度很慢,因为它移动的是重叠区域,必须在一个紧密的循环中实现它,而不是复制大内存页。我写了一个小型的微基准测试,以找出memcpy和memmove之间的性能差异,期望memcpy能够胜任。 我在两台机器(核心i5,核心i7)上运行了基准测试,发现memmove实际上比memcpy快,在较旧的i7核心上甚至快两倍。现在,我正在寻找解释。 这是我的基准。它使用memcpy复制100 mb,然后使用memmove复制大约100 mb;源和目标重叠。尝试了源和目的地的各种“距离”。每次测试运行10次,平均时间被打印出来。 https://gist.github.com/cruppstahl/78a57cdf937bca3d062c 以下是Core i5(Linux 3.5.0-54-通用#81〜precise1-Ubuntu SMP x86_64 GNU / Linux)上的结果,gcc为4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)。括号中的数字为源与目标之间的距离(间隙大小): memcpy 0.0140074 memmove (002) 0.0106168 memmove (004) 0.01065 memmove (008) 0.0107917 memmove (016) 0.0107319 memmove (032) 0.0106724 memmove (064) 0.0106821 memmove (128) 0.0110633 Memmove被实现为SSE优化的汇编代码,从后到前复制。它使用硬件预取将数据加载到缓存中,然后将128个字节复制到XMM寄存器中,然后将其存储在目标位置。 (memcpy-ssse3-back.S,行1650 ff) L(gobble_ll_loop): prefetchnta -0x1c0(%rsi) prefetchnta -0x280(%rsi) prefetchnta …
89 c++  c  performance  memory 

3
“假设”规则到底是什么?
如标题所示, “假设”规则到底是什么? 一个典型的答案是: 允许任何和所有代码转换而不会改变程序可观察行为的规则 我们会不时地从某些实现中获得归因于该规则的行为。很多次是错误的。所以,这条规则到底是什么。该标准没有明确提及该规则的一部分或段落,那么该规则的作用范围到底是什么?对我来说,这似乎是一个灰色区域,该标准未对其进行详细定义。有人可以引用标准的参考文献来详细说明细节吗? 注意:将此标记为C和C ++,因为它与两种语言都相关。
89 c++  c  optimization  c++-faq  as-if 

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.