Questions tagged «c»

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

9
是否可以在C中修改char字符串?
我一直在努力处理各种与指针有关的C教程和书籍,但是我真正想知道的是,一旦创建了char指针,是否有可能更改它。 这是我尝试过的: char *a = "This is a string"; char *b = "new string"; a[2] = b[1]; // Causes a segment fault *b[2] = b[1]; // This almost seems like it would work but the compiler throws an error. 那么,有什么办法可以改变字符串中的值而不是指针地址?
80 c  string  debugging 

7
我们应该在C语言中使用exit()吗?
有问题关于使用exitC ++中。答案讨论这不是一个好主意,主要是因为RAII,例如,如果exit在代码中的某处调用了对象,则不会调用对象的析构函数,因此,例如,如果要使用析构函数将数据写入文件,则不会发生这种情况,因为未调用析构函数。 我对C中的这种情况很感兴趣。类似的问题也适用于C吗?我以为既然在C语言中我们不使用构造函数/析构函数,那么exitC语言中的情况可能会有所不同。那么在C语言中使用可以吗? 我已经看到了下面的函数,在某些情况下可以很好地使用它,但是是否对我们在C中使用using存在类似的问题感兴趣exit,如上面的C ++所述?(这会使使用下面的功能不是一个好主意。)。 void die(const char *message) { if(errno) { perror(message); } else { printf("ERROR: %s\n", message); } exit(1); }
80 c 

6
在C中打印地址或指针以获取值
我想做一些看起来很简单的事情。我得到结果,但是问题是,我无法知道结果是否正确。 我在C语言中工作,有两个指针。我想打印指针的内容。我不想取消引用指针以获取指向的值,我只想要指针已存储的地址。 我编写了以下代码,我需要知道的是,是否正确,如何更正。 /* item one is a parameter and it comes in as: const void* item1 */ const Emp* emp1 = (const Emp*) item1; printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 ); 在我发布此内容时(以及正确的原因很重要)是,我最终需要针对指针到指针进行此操作。那是: const Emp** emp1 = (const Emp**) item1;

13
尝试将GDB附加到进程时如何解决“不允许的ptrace操作”?
我正在尝试使用gdb附加程序,但它返回: 附加到进程29139 无法附加到进程。如果您的uid与目标进程的uid相匹配,请检查/ proc / sys / kernel / yama / ptrace_scope的设置,或者以root用户的身份重试。有关更多详细信息,请参见/etc/sysctl.d/10-ptrace.conf ptrace:不允许操作。 gdb-debugger返回“无法附加到进程,请检查特权,然后重试。” strace返回“附加:ptrace(PTRACE_ATTACH,...):不允许操作” 我将“ kernel.yama.ptrace_scope”从1更改为0,将/proc/sys/kernel/yama/ptrace_scope1更改为0,并尝试set environment LD_PRELOAD=./ptrace.so使用此方法: #include <stdio.h> int ptrace(int i, int j, int k, int l) { printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l); return 0; } 但是它仍然返回相同的错误。如何将其附加到调试器?
80 c  linux  debugging  gdb  strace 

11
将int转换为ASCII字符
我有 int i = 6; 而且我要 char c = '6' 通过转换。有什么简单的建议吗? 编辑: 我也需要生成一个随机数,并将其转换为char,然后添加“ .txt”并在ifstream中访问它。
80 c++  c  ascii 

7
为什么strlcpy和strlcat不安全?
据我所知,strlcpy和strlcat被设计为安全的替代品strncpy和strncat。但是,有些人仍然认为他们没有安全感,只会引起另一种类型的问题。 有人可以举一个使用strlcpy或strlcat(即始终为null的函数终止其字符串)如何导致安全问题的示例吗? 乌尔里希·德雷珀(Ulrich Drepper)和詹姆斯·安提尔(James Antill)指出,这是事实,但从未提供示例或阐明这一点。
80 c  security  strncpy  strlcpy 

9
这是在C中实现+运算符的方式吗?
当了解如何原始的运营商,如+,-,*并/用C实现,我发现从下面的代码片段一个有趣的答案。 // replaces the + operator int add(int x, int y) { while(x) { int t = (x & y) <<1; y ^= x; x = t; } return y; } 似乎该功能演示了如何+在后台实际工作。但是,这让我难以理解。我相信这种操作是使用编译器生成的汇编指令很长时间完成的! +操作员是否按照发布在MOST实施中的代码实施?这是否利用了二进制补码或其他与实现相关的功能?

2
试图了解gcc选项-fomit-frame-pointer
我要求Google给我gccoption的含义,该选项-fomit-frame-pointer将我重定向到以下语句。 -fomit-frame-pointer 不要将帧指针保存在不需要一个的寄存器中。这避免了保存,设置和恢复帧指针的指令。它还使许多功能中都有一个额外的寄存器。这也使得在某些机器上无法进行调试。 据我对每个功能的了解,将在过程存储器的堆栈中创建一个激活记录,以保留所有局部变量和更多信息。我希望该帧指针表示功能激活记录的地址。 在这种情况下,什么类型的函数不需要将帧指针保留在寄存器中?如果获得此信息,我将尝试基于此设计新功能(如果可能),因为如果帧指针未保存在寄存器中,则某些指令将以二进制形式省略。在具有许多功能的应用程序中,这确实可以显着提高性能。

4
多行预处理器宏
如何使多行预处理器宏?我知道如何写一行: #define sqr(X) (X*X) 但我需要这样的东西: #define someMacro(X) class X : public otherClass { int foo; void doFoo(); }; 我怎样才能使它工作? 这只是一个例子,实际的宏可能很长。
79 c++  c  c-preprocessor 

11
结果括号是否在return语句中有意义?
函数内部的这两个语句之间有区别吗? bool returnValue = true; // Code that does something return(returnValue); 还有这个? bool returnValue = true; // Code return returnValue; 前者周围有括号returnValue。
79 c++  c  semantics 

5
为什么编译器会抛出此警告:“缺少初始化器”?结构没有初始化吗?
我正在为程序创建某种前端。要启动该程序,我使用调用CreateProcess(),它除其他外还接收指向STARTUPINFO结构的指针。要初始化我曾经做过的结构: STARTUPINFO startupInfo = {0}; // Or even '\0'. startupInfo.cb = sizeof(startupInfo); 当使用启用了这些警告的GCC编译程序时,-Wall -Wextra它向我发出警告,指出缺少指向第一行的初始化程序。 warning: missing initializer warning: (near initialization for 'startupInfo.lpReserved') 所以我最终做了: STARTUPINFO startupInfo; memset(&startupInfo, 0, sizeof(startupInfo)); startupInfo.cb = sizeof(startupInfo); 这样,编译器就不会发出任何警告。问题是,这些初始化结构的方式之间有什么区别?使用第一种方法,是否不初始化结构?您会推荐哪一个?
79 c  winapi  gcc 

24
在经过排序和旋转的数组中搜索
在准备面试时,我偶然发现了一个有趣的问题: 您将得到一个经过排序然后旋转的数组。 例如: 让arr = [1,2,3,4,5]排序 将其向右旋转两次以给出[4,5,1,2,3]。 现在,如何最好地在此排序后的旋转数组中进行搜索? 可以取消旋转数组,然后进行二进制搜索。但这并不比在输入数组中进行线性搜索更好,因为两者都是最差情况的O(N)。 请提供一些指示。我为此搜索了很多特殊算法,但找不到任何算法。 我了解C和C ++。
79 c++  c  arrays  algorithm 


12
如何使用printf重复字符?
我想做一些printf("?", count, char)重复角色count时间的事情。 什么是完成此操作的正确格式字符串? 编辑:是的,很明显,我可以printf()循环调用,但这就是我想要避免的事情。
79 c  printf 


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.