Questions tagged «c»

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

8
将变量声明放置在C中
我一直以为在C语言中,所有变量都必须在函数开始时声明。我知道C99中的规则与C ++中的规则相同,但是C89 / ANSI C的变量声明放置规则是什么? 以下代码使用gcc -std=c89和成功编译gcc -ansi: #include <stdio.h> int main() { int i; for (i = 0; i < 10; i++) { char c = (i % 95) + 32; printf("%i: %c\n", i, c); char *s; s = "some string"; puts(s); } return 0; } 不应该的声明c,并s导致C89 / ANSI模式错误?
129 c  declaration  c89 

6
在套接字库中调用recv时,我的recv缓冲区应该有多大
我对C语言中的套接字库有一些疑问。这是我在问题中将参考的一小段代码。 char recv_buffer[3000]; recv(socket, recv_buffer, 3000, 0); 我如何确定要使recv_buffer多大?我正在使用3000,但是它是任意的。 如果recv()收到比我的缓冲区大的数据包怎么办? 我怎么知道我是否收到了整个消息而又没有再次调用recv,并且在什么都没收到的情况下让它永远等待? 有没有一种方法可以使缓冲区没有固定的空间,这样我就可以继续添加缓冲区而不必担心空间不足?也许strcat用于连接recv()对缓冲区的最新响应? 我知道很多问题合而为一,但是我将不胜感激。
129 c  sockets  buffer  recv 

6
为什么带有GCC的x86上的整数溢出会导致无限循环?
以下代码在GCC上进入了无限循环: #include <iostream> using namespace std; int main(){ int i = 0x10000000; int c = 0; do{ c++; i += i; cout << i << endl; }while (i > 0); cout << c << endl; return 0; } 所以这是要解决的问题:有符号整数溢出在技术上是未定义的行为。但是x86上的GCC使用x86整数指令实现了整数算术-溢出会自动换行。 因此,尽管它是未定义的行为,但我希望它能溢出。但这显然不是事实。那我想念什么? 我使用以下代码编译了此代码: ~/Desktop$ g++ main.cpp -O2 GCC输出: ~/Desktop$ ./a.out 536870912 1073741824 …
129 c++  c  gcc  x86  undefined-behavior 

15
C编程中void指针的概念
是否可以取消引用void指针而无需使用C编程语言进行类型转换? 另外,有没有一种方法可以泛化一个可以接收指针并将其存储在void指针中的函数,并且通过使用该void指针,我们可以制作一个泛化的函数吗? 例如: void abc(void *a, int b) { if(b==1) printf("%d",*(int*)a); // If integer pointer is received else if(b==2) printf("%c",*(char*)a); // If character pointer is received else if(b==3) printf("%f",*(float*)a); // If float pointer is received } 我想使此函数通用而不使用if-else语句-这可能吗? 另外,如果有很好的互联网文章解释了空指针的概念,那么提供URL将是有益的。 另外,使用空指针的指针算术是否可能?
129 c  void-pointers 

11
如何允许使用scanf输入空格?
使用以下代码: char *name = malloc(sizeof(char) + 256); printf("What is your name? "); scanf("%s", name); printf("Hello %s. Nice to meet you.\n", name); 用户可以输入他们的名字,但是当他们输入带有空格的名字时Lucas Aardvark,scanf()后面的所有内容都会被切断Lucas。我如何留出scanf()空间
129 c  string  printf  scanf  whitespace 

9
什么时候以及为什么编译器会在malloc / free / new / delete上将内存初始化为0xCD,0xDD等?
我知道编译器有时会使用诸如0xCD和的某些模式来初始化内存0xDD。我想知道的是何时以及为什么发生这种情况。 什么时候 这特定于所使用的编译器吗? 做malloc/new与free/delete工作以同样的方式对本? 它是平台特定的吗? 它会在其他操作系统(例如Linux或)上发生VxWorks吗? 为什么 我的理解是,这仅在Win32调试配置中发生,它用于检测内存溢出并帮助编译器捕获异常。 您能提供一些有关初始化有用的实际例子吗? 我记得读过一些东西(也许在代码完成2中),说在分配内存时将内存初始化为已知模式是很好的,某些模式会触发中断,Win32从而导致调试器中显示异常。 这有多便携?

3
在C89模式下编译时,下面的程序如何输出C89?在C99模式下编译时,下面的程序如何输出?
我从网上找到了这个C程序: #include <stdio.h> int main(){ printf("C%d\n",(int)(90-(-4.5//**/ -4.5))); return 0; } 该程序的有趣之处在于,当它在C89模式下编译并运行时,它会打印,C89而当它在C99模式下编译并运行时,它会打印C99。但我无法弄清楚该程序如何工作。 您能否解释printf上述程序中第二个参数的工作方式?
128 c  printf  comments  c99  c89 

12
将Python编译为机器代码是否可行?
将Python(可能通过中间C表示形式)编译为机器代码的可行性如何? 大概需要链接到Python运行时库,并且Python标准库中Python本身的任何部分也需要进行编译(并链接)。 另外,如果您想对表达式进行动态求值,则需要捆绑Python解释器,但是也许不允许这样做的Python子集仍然有用。 它会提供任何速度和/或内存使用优势吗?大概可以省去Python解释器的启动时间(尽管共享库在启动时仍需要加载)。
128 python  c  linker  compilation 

30
如何将枚举类型变量转换为字符串?
如何使printf显示枚举类型的变量的值?例如: typedef enum {Linux, Apple, Windows} OS_type; OS_type myOS = Linux; 我需要的是 printenum(OS_type, "My OS is %s", myOS); 其中必须显示字符串“ Linux”,而不是整数。 我想,首先我必须创建一个值索引的字符串数组。但是我不知道这是否是最美丽的方式。有可能吗?
128 c++  c  preprocessor  ansi-c 

10
指针表达式:* ptr ++,* ++ ptr和++ * ptr
最近,我遇到了一个我自己无法理解的问题。 这三个表达式实际上是什么意思? *ptr++ *++ptr ++*ptr 我试过里奇。但不幸的是,他无法按照他对这3项操作的讲述进行操作。 我知道它们都是为了增加指针/指向的值而执行的。我还可以猜测,关于评估的优先级和顺序可能有很多事情。就像先递增指针,然后获取该指针的内容一样,先获取内容,然后递增指针,等等。如您所见,我对它们的实际操作并不清楚,我想尽快清除。但是当我有机会在程序中应用它们时,我真的迷失了。例如: int main() { const char *p = "Hello"; while(*p++) printf("%c",*p); return 0; } 给我这个输出: ello 但是我希望它能打印出来Hello。最后一个要求-请提供示例,说明每个表达式在给定代码段中的工作方式。大多数时候,只有一小段理论飞过我的脑海。
128 c++  c  pointers  increment 

7
如果在C / C ++中定义一个0大小的数组,会发生什么情况?
只是好奇,如果我int array[0];在代码中定义零长度数组,实际上会发生什么?GCC一点也不抱怨。 样例程序 #include <stdio.h> int main() { int arr[0]; return 0; } 澄清度 我实际上是想弄清楚是否以这种方式初始化了零长度数组,而不是像在Darhazer的注释中指出的那样,对可变长度进行了优化。 这是因为我必须向野外发布一些代码,所以我试图确定是否必须处理SIZE定义为的情况0,这在某些静态定义的代码中发生int array[SIZE]; 实际上,我很惊讶GCC没有投诉,这引起了我的疑问。从我收到的答案中,我认为缺少警告的主要原因是支持未使用新的[]语法更新的旧代码。 因为我主要是想知道错误,所以我将隆丁的答案标记为正确的(纳瓦兹是第一个,但还不够完整),其他人则指出了它在尾部填充结构中的实际用途是“正确的”。正是我想要的。
127 c++  c  arrays 

3
在同一套接字上发送/接收的并行调用是否有效?
我们可以在同一个套接字上从一个线程调用send并从另一个线程调用recv吗? 我们可以在同一套接字上从不同线程调用多个并行发送吗? 我知道好的设计应该避免这种情况,但是我不清楚这些系统API的行为方式。同样,我也找不到很好的文档。 方向上的任何指针都会有所帮助。
127 c  networking  sockets 



5
Python(和Python C API):__new__与__init__
我要问的问题似乎是Python对__new__和__init__的重复使用?,但无论如何,我仍然不清楚__new__和之间的实际区别是什么__init__。 在您急于告诉我__new__创建对象和__init__初始化对象之前,请让我明确:我明白了。 实际上,这种区分对我来说是很自然的,因为我在C ++中有经验,在那里我们放置了new,它类似地将对象分配与初始化分开。 在Python的C API教程解释它是这样的: 新成员负责创建(而不是初始化)该类型的对象。它在Python中作为__new__()方法公开。... 实施新方法的原因之一是要确保实例变量的初始值。 所以,是的-我明白了__new__,但是尽管如此,我仍然不明白为什么它在Python中很有用。给出的示例说,__new__如果要“确保实例变量的初始值” ,这可能会很有用。好吧,这不正是要做__init__什么吗? 在C API教程中,显示​​了一个示例,其中创建了新的Type(称为“ Noddy”),并__new__定义了Type的功能。Noddy类型包含一个名为的字符串成员first,并且该字符串成员被初始化为一个空字符串,如下所示: static PyObject * Noddy_new(PyTypeObject *type, PyObject *args, PyObject *kwds) { ..... self->first = PyString_FromString(""); if (self->first == NULL) { Py_DECREF(self); return NULL; } ..... } 请注意,如果没有在此__new__定义的方法,我们将不得不使用PyType_GenericNew,它只会将所有实例变量成员初始化为NULL。因此,该__new__方法的唯一好处是实例变量将从一个空字符串开始,而不是NULL。 但是,为什么这会有用呢,因为如果我们要确保将实例变量初始化为某个默认值,那么我们可以在__init__方法中做到这一点?
126 python  c  python-c-api 

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.