Questions tagged «c»

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

2
启用优化后,为什么此代码慢6.5倍?
我想基准glibc的strlen功能,出于某种原因,发现它显然执行多慢与GCC启用优化,我不知道为什么。 这是我的代码: #include <time.h> #include <string.h> #include <stdlib.h> #include <stdio.h> int main() { char *s = calloc(1 << 20, 1); memset(s, 65, 1000000); clock_t start = clock(); for (int i = 0; i < 128; ++i) { s[strlen(s)] = 'A'; } clock_t end = clock(); printf("%lld\n", (long long)(end - start)); …
68 c  performance  gcc  glibc 

14
隐藏C结构中的成员
我一直在阅读有关C语言中的OOP的知识,但我从未喜欢过如何像C ++中那样拥有私有数据成员。但是后来我想到可以创建2个结构。一个在头文件中定义,另一个在源文件中定义。 // ========================================= // in somestruct.h typedef struct { int _public_member; } SomeStruct; // ========================================= // in somestruct.c #include "somestruct.h" typedef struct { int _public_member; int _private_member; } SomeStructSource; SomeStruct *SomeStruct_Create() { SomeStructSource *p = (SomeStructSource *)malloc(sizeof(SomeStructSource)); p->_private_member = 42; return (SomeStruct *)p; } 从这里您可以将一个结构转换为另一个结构。这被认为是不良做法吗?还是经常做?

9
scanf的缺点
我想知道的缺点scanf()。 在许多站点中,我读到使用scanf可能会导致缓冲区溢出。这是什么原因呢?还有其他缺点scanf吗?
68 c  input  user-input  scanf 

7
尽管-g标志,Valgrind仍不显示行号(在Ubuntu 11.10 / VirtualBox上)
我正在关注“艰难学习C”,特别是关于Valgrind的章节。本章为您提供一个故意错误的程序,以显示Valgrind的工作方式。 当我在Valgrind下运行该练习时,在堆栈跟踪中没有得到行号,只是出现了“(在main以下)”错误。 我肯定在编译-g标志。 我的Valgrind输出如下: djb@twin:~/projects/Learning/C$ valgrind ./ex4 ==5190== Memcheck, a memory error detector ==5190== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al. ==5190== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info ==5190== Command: ./ex4 ==5190== ==5190== Use of uninitialised value of size 4 ==5190== at …
68 c  valgrind 

3
C中的文件结尾(EOF)
我目前正在阅读Ritchie&Kernighan撰写的《 C编程语言》一书。对于getchar()函数中EOF的使用,我感到很困惑。 首先,我想知道为什么EOF的值为-1,为什么EOF的值为getchar()!=EOF0。请原谅我的问题,但我真的不明白。我确实尝试过,但不能。 然后,我尝试在书上运行可以使用以下代码计数字符数的示例,但即使按回车键,我也似乎永远不会循环,所以我想知道何时到达EOF? main(){ long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%ld\n", nc); } 然后,我在C中的EOF问题中阅读了相同的问题。大多数人建议不要使用EOF,而应使用终止符\ n或空终止符'\ 0',这很有意义。 这是否意味着书中的示例还有其他目的?
68 c  eof 

13
是否在行业标准中禁止#define?
我是一年级计算机专业的学生,我的教授说#define的行业标准,以及被禁止#if,#ifdef,#else,和其他一些预处理指令。由于出现意外行为,他使用了“禁止”一词。 这个准确吗?如果可以,为什么? 实际上,是否有任何禁止使用这些指令的标准?

13
Mac OS X中的clock_gettime替代
通过MacPorts安装必要的库后,在Mac OS X上编写的程序编译时,出现此错误: In function 'nanotime': error: 'CLOCK_REALTIME' undeclared (first use in this function) error: (Each undeclared identifier is reported only once error: for each function it appears in.) 似乎clock_gettime在Mac OS X中未实现。是否存在另一种以十亿分之一秒为单位的时间获取时间的方法?不幸的是以微秒为单位。gettimeofday
68 c  macos  time  clock 


8
使用malloc分配具有不同行长的多维数组
我有以下C代码: int *a; size_t size = 2000*sizeof(int); a = (int *) malloc(size); 效果很好。但是如果我有以下内容: char **b = malloc(2000*sizeof *b); 其中的每个元素b都有不同的长度。 怎么可能做b和我一样的事情a;即下面的代码将保持正确? char *c; size_t size = 2000*sizeof(char *); c = (char *) malloc(size);
68 c  arrays  malloc 

3
c11中的多线程支持
新的C11标准提供了对多线程的支持。 我的问题有点多样化,但肯定可以回答。 我看过C11 n1570草案。 它说: 支持多个执行线程,包括改进的内存排序模型,原子对象和线程本地存储(<stdatomic.h>和<threads.h>) 什么是改进的内存排序模型?与c99标准相比有何​​变化? 除了有人引用标准之外,如果有人深入研究它们并尝试解释所涉及的语义,我将不胜感激。 据我了解,C11提供以下支持: 线程创建和管理 互斥体 条件变量 线程专用存储和 原子物体 我希望我没有错过任何事情吗? 由于现在标准库本身提供了(将提供)多线程所需的所有功能,因此将来将不需要POSIX和此类库(用于多线程支持)吗? 最后,哪些编译器为上述功能提供支持?是否有关于何时支持时间表的参考? 我记得对于C ++ 11,有一个指向编译器支持和功能的链接,也许是这样的?
68 c  multithreading  c11 

2
如何制作进程守护进程
我试图了解如何使我的程序成为守护程序,因此遇到的一些事情通常是程序执行以下步骤来成为守护程序: 致电fork( )。 在家长中,致电exit( )。这样可确保原始父级(守护程序的祖父母)对它的子级终止,守护程序的父级不再运行以及该守护程序不是进程组负责人感到满意。最后一点是成功完成下一步的要求。 调用setsid( ),为守护程序提供一个新的进程组和会话,两者均将其作为领导者。这也可以确保该进程没有关联的控制终端(因为该进程只是创建了一个新会话,并且不会分配一个会话)。 通过将工作目录更改为根目录chdir( )。这样做是因为继承的工作目录可以在文件系统上的任何位置。守护程序通常会在系统正常运行的时间内运行,并且您不想保持某些随机目录打开,从而阻止管理员卸载包含该目录的文件系统。 关闭所有文件描述符。 打开文件描述符0、1和2(标准输入,标准输出和标准错误),然后将它们重定向到/dev/null。 #include <sys/types.h> #include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <linux/fs.h> int main (void) { pid_t pid; int i; /* create new process */ pid = fork ( ); if (pid == -1) return -1; else …

1
iOS中的Delphi XE6链接C代码
我已经在Android上使用需要C代码的Delphi XE6构建了一个应用程序。但是在iOS上,我无法使其正常运行。我怀疑问题与手臂/拇指状态有关,但我不确定。在这两种系统中,从Pascal调用C代码都没有问题。但是,如果C代码回调了Pascal过程,iOS会生成一个"bad system call (12)" 这是帕斯卡代码: function testarm(a,b:integer):integer; cdecl; external "testC.o"; Procedure testC; Begin testarm(1,2); end; function BackToPascal(a,b:integer): integer; cdecl; Begin result := a+b; end; ...... exports BackToPascal; 这是C代码: extern int BackToPascal(int a,int b); extern int testarm(int a,int b) { int i; i = BackToPascal(a,b); return i+1; } 在android上,这就是我的编译方式(正在运行): ..."arm-linux-androideabi-gcc.exe" …
68 ios  c  delphi  pascal  delphi-xe6 

4
如何在JNI中将C结构来回传递给Java代码?
我有一些通过JNI调用的C函数,这些函数带有指向结构的指针,还有一些其他函数将分配/释放指向相同类型结构的指针,因此处理包装程序要容易一些。令人惊讶的是,JNI文档很少介绍如何处理C结构。 我的C头文件如下所示: typedef struct _MyStruct { float member; } MyStruct; MyStruct* createNewMyStruct(); void processData(int *data, int numObjects, MyStruct *arguments); 相应的JNI C包装文件包含: JNIEXPORT jobject JNICALL Java_com_myorg_MyJavaClass_createNewMyStruct(JNIEnv *env, jobject this) { return createNewMyStruct(); } JNIEXPORT void JNICALL Java_com_myorg_MyJavaClass_processData(JNIEnv *env, jobject this, jintArray data, jint numObjects, jobject arguments) { int *actualData = (*env)->GetIntArrayElements(env, …

10
Linux中的守护程序日志记录
因此,我有一个在Linux系统上运行的守护程序,并且我想要记录其活动:日志。问题是,完成此任务的“最佳”方法是什么? 我的第一个想法是简单地打开一个文件并将其写入。 FILE* log = fopen("logfile.log", "w"); /* daemon works...needs to write to log */ fprintf(log, "foo%s\n", (char*)bar); /* ...all done, close the file */ fclose(log); 用这种方式记录日志有天生的错误吗?有没有更好的方法,例如Linux内置的某些框架?
67 c  linux  logging  daemon 

11
为什么每次都要在C中指定数据类型?
从下面的代码片段中可以看到,我声明了一个char变量和一个int变量。编译代码时,它必须标识变量str和的数据类型i。 为什么在扫描变量时需要通过指定%sor%d来再次告知它是字符串还是整数变量scanf?声明变量时,编译器还不够成熟,无法识别吗? #include <stdio.h> int main () { char str [80]; int i; printf ("Enter your family name: "); scanf ("%s",str); printf ("Enter your age: "); scanf ("%d",&i); return 0; }

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.