Questions tagged «c»

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


8
brk()系统调用做什么?
根据Linux程序员手册: brk()和sbrk()更改程序中断的位置,该位置定义了进程数据段的结尾。 数据段在这里意味着什么?仅仅是数据段或数据,BSS和堆的组合? 根据Wiki: 有时,数据,BSS和堆区域统称为“数据段”。 我没有理由仅更改数据段的大小。如果是数据,BSS和堆一起使用,则有意义的是堆将获得更多空间。 这使我想到了第二个问题。到目前为止,在我读过的所有文章中,作者都​​说堆向上增长,而堆栈向下增长。但是他们没有解释的是当堆占据了堆和栈之间的所有空间时会发生什么?
184 c  linux  unix  memory-management  brk 

6
多维数组如何在内存中格式化?
在C语言中,我知道可以使用以下代码在堆上动态分配一个二维数组: int** someNumbers = malloc(arrayRows*sizeof(int*)); for (i = 0; i < arrayRows; i++) { someNumbers[i] = malloc(arrayColumns*sizeof(int)); } 显然,这实际上创建了指向一堆单独的一维整数数组的一维指针数组,并且“系统”可以弄清楚我要问的意思: someNumbers[4][2]; 但是当我静态声明2D数组时,如以下行所示: int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS]; ...是否在堆栈上创建了类似的结构,还是完全是另一种形式?(即它是一维指针数组吗?如果不是,它是什么,以及如何找出对其的引用?) 另外,当我说“系统”时,实际上是由什么负责的?内核?还是C编译器在编译时将其整理出来?


8
在参数数量上重载宏
我有两个宏FOO2和FOO3: #define FOO2(x,y) ... #define FOO3(x,y,z) ... 我想定义一个新的宏FOO,如下所示: #define FOO(x,y) FOO2(x,y) #define FOO(x,y,z) FOO3(x,y,z) 但这是行不通的,因为宏不会在参数数量上重载。 无需修改FOO2和FOO3,是有一些方法来定义一个宏FOO(使用__VA_ARGS__或以其他方式),以获得分派的相同的效果FOO(x,y)来FOO2,并FOO(x,y,z)到FOO3?
183 c  macros  c-preprocessor 

22
内联汇编语言是否比本机C ++代码慢?
我试图比较内联汇编语言和C ++代码的性能,所以我写了一个函数,将两个大小为2000的数组相加100000次。这是代码: #define TIMES 100000 void calcuC(int *x,int *y,int length) { for(int i = 0; i < TIMES; i++) { for(int j = 0; j < length; j++) x[j] += y[j]; } } void calcuAsm(int *x,int *y,int lengthOfArray) { __asm { mov edi,TIMES start: mov esi,0 mov ecx,lengthOfArray label: mov …
183 c++  c  performance  assembly 

16
C逐行读取文件
我编写了此函数来从文件中读取一行: const char *readLine(FILE *file) { if (file == NULL) { printf("Error: file pointer is null."); exit(1); } int maximumLineLength = 128; char *lineBuffer = (char *)malloc(sizeof(char) * maximumLineLength); if (lineBuffer == NULL) { printf("Error allocating memory for line buffer."); exit(1); } char ch = getc(file); int count = 0; …
183 c  file-io  line  std 


8
如何正确比较字符串?
我试图获得一个程序,让用户输入单词或字符,存储它,然后打印它,直到用户再次键入它,退出程序。我的代码如下所示: #include <stdio.h> int main() { char input[40]; char check[40]; int i=0; printf("Hello!\nPlease enter a word or character:\n"); gets(input); printf("I will now repeat this until you type it back to me.\n"); while (check != input) { printf("%s\n", input); gets(check); } printf("Good bye!"); return 0; } 问题是,即使用户输入(检查)与原始输入(输入)匹配,我仍会继续打印输入字符串。我是否错误地比较了两者?
182 c  string  strcmp 

2
实际使用C99'restrict'关键字吗?
我浏览了一些文档和问题/答案,并看到其中提到的内容。我读了一个简短的说明,指出程序员基本上会保证不会使用指针指向其他地方。 谁能提供一些实际的案例,值得使用它吗?
182 c  gcc  c99  restrict-qualifier 

6
如何在Objective-C中定义和使用ENUM?
我在实现文件中声明了一个枚举,如下所示,并在我的接口中将该类型的变量声明为PlayerState thePlayerState;并在我的方法中使用了变量。但是我收到错误消息指出它是未声明的。如何在我的方法中正确声明和使用PlayerState类型的变量?: 在.m文件中 @implementation View1Controller typedef enum playerStateTypes { PLAYER_OFF, PLAYER_PLAYING, PLAYER_PAUSED } PlayerState; 在.h文件中: @interface View1Controller : UIViewController { PlayerState thePlayerState; 在.m文件中的某些方法中: -(void)doSomethin{ thePlayerState = PLAYER_OFF; }
180 iphone  objective-c  c 

16
C和C ++中的静态变量存储在哪里?
静态变量存储在可执行文件的哪个段(.BSS,.DATA等)中,因此它们不会发生名称冲突?例如: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf("%d,%d", foo, bar); printf("%d, %d", foo, bar); } } 如果我同时编译两个文件并将其链接到重复调用fooTest()和barTest的主文件,则printf语句将独立增加。这是有道理的,因为foo和bar变量是转换单元的本地变量。 但是在哪里分配存储空间? 明确地说,假设您拥有一个可以以ELF格式输出文件的工具链。因此,我相信,有有将一些空间,对于那些静态变量的可执行文件保留。 出于讨论目的,假设我们使用GCC工具链。

4
如何使用valgrind查找内存泄漏?
如何使用valgrind查找程序中的内存泄漏? 请有人帮助我并描述执行该程序的步骤吗? 我正在使用Ubuntu 10.04,并且我有一个程序a.c,请帮帮我。
180 c  valgrind 


10
切换语句:默认值是否必须是最后一种情况?
考虑以下switch语句: switch( value ) { case 1: return 1; default: value++; // fall-through case 2: return value * 2; } 该代码可以编译,但是对于C90 / C99是否有效(=定义的行为)?我从未见过默认情况不是最后一种情况的代码。 编辑: 正如乔恩·凯奇(Jon Cage)和基里安(KillianDS)写道:这确实很丑陋和令人困惑的代码,我对此很清楚。我只对通用语法(是否已定义?)和预期的输出感兴趣。

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.