Tag: gcc

为什么在释放指针后取消引用时会得到不同的结果?

我对C中的内存管理(以及Debian GNU / Linux下的GCC 4.3.3)提出了疑问。 根据K&R的C编程语言书(第7.8.5节),当我释放指针然后取消引用它时,是一个错误。 但是我有些怀疑,因为我注意到有时候,就像我在下面粘贴的源代码一样,编译器(?)似乎按照明确定义的原则工作。 我有一个像这样的简单程序,它显示了如何返回动态分配的数组: #include #include int * ret_array(int n) { int * arr = (int *) malloc(10 * sizeof(int)); int i; for (i = 0; i < n; i++) { arr[i] = i*2; } printf("Address pointer in ret_array: %p\n", (void *) arr); return arr; } int * ret_oth_array(int n) { […]

为什么整数除以-1(负一)导致FPE?

我的任务是表达一些看似奇怪的C代码行为(在x86上运行)。 我可以很容易地完成其他所有事情,但是这个让我很困惑。 代码段1输出-2147483648 int a = 0x80000000; int b = a / -1; printf(“%d\n”, b); 代码片段2不输出任何内容,并提供Floating point exception int a = 0x80000000; int b = -1; int c = a / b; printf(“%d\n”, c); 我很清楚代码片段1( 1 + ~INT_MIN == INT_MIN )的结果的原因,但我不太明白整数除法-1如何生成FPE,也不能在我的Android手机上重现它(AArch64 ,海湾合作委员会7.2.0)。 代码2只输出与代码1相同,没有任何例外。 它是x86处理器的隐藏bugfunction吗? 该任务没有告诉任何其他内容(包括CPU架构),但由于整个课程基于桌面Linux发行版,您可以放心地假设它是一个现代的x86。 编辑 :我联系了我的朋友,他在Ubuntu 16.04(Intel Kaby Lake,GCC 6.3.0)上测试了代码。 结果与所指定的任何内容一致(代码1输出所述内容,代码2与FPE崩溃)。

GCC左移溢出

以下小程序在Mac上使用GCC版本4.2.1(Apple Inc. build 5664)非常尴尬。 #include int main(){ int x = 1 << 32; int y = 32; int z = 1 << y; printf("x:%d, z: %d\n", x, z); } 结果是x:0, z: 1 。 知道为什么x和z的值不同吗? 非常感谢。

!!(x)在C(特别是Linux内核)中的含义是什么?

我一直在阅读Linux内核(特别是2.6.11)。 我遇到了以下定义: #define unlikely(x) __builtin_expect(!!(x), 0) (来自linux-2.6.11 / include / linux / compiler.h:61 lxr链接 ) 什么!! 完成? 为什么不使用(x)? 也可以看看: 逻辑否定如何在C中起作用? C ++代码中的双重否定。

什么是“条带”(GCC应用程序)用于?

这个小应用程序是什么? 在没有任何选项的情况下使用它会减少可执行文件的大小,但它如何/它做什么?

Switch case语句如何实现或在内部工作?

我在某处读到了switch语句使用“二进制搜索”或一些排序技术来精确选择正确的情况,与else-if梯形图相比,这增加了它的性能。 如果我们按顺序给出案例,那么交换机的工作速度会更快吗? 是这样吗? 你能在这个问题上添加宝贵的建议吗? 我们在这里讨论了相同的问题并计划发布作为一个问题。

为什么在float文字的末尾添加0会改变它的轮次(可能是GCC错误)?

我在x86 VM(32位)上发现了以下程序: #include void foo (long double x) { int y = x; printf(“(int)%Lf = %d\n”, x, y); } int main () { foo(.9999999999999999999728949456878623891498136799780L); foo(.999999999999999999972894945687862389149813679978L); return 0; } 产生以下输出: (int)1.000000 = 1 (int)1.000000 = 0 Ideone也会产生这种行为。 编译器做了什么来实现这一点? 我发现这个不变,因为我正在追踪为什么以下程序没有像我预期的那样产生0 (使用19 9 s产生了我预期的0 ): int main () { long double x = .99999999999999999999L; /* 20 9’s */ […]

嵌套函数的实现

我最近发现gcc允许定义嵌套函数。 在我看来,这是一个很酷的function,但我想知道如何实现它。 虽然通过将上下文指针作为隐藏参数传递来实现嵌套函数的直接调用当然不难,但gcc还允许获取指向嵌套函数的指针并将此指针传递给任意其他函数,而该函数又可以调用嵌套函数上下文的function。 因为调用嵌套函数的函数只有要调用的嵌套函数的类型,所以它显然不能传递上下文指针。 我知道,其他语言如Haskell有一个更复杂的调用约定允许部分应用程序支持这些东西,但我认为没有办法在C中这样做。如何实现这一点? 以下是一个说明问题的案例的小例子: int foo(int x,int(*f)(int,int(*)(void))) { int counter = 0; int g(void) { return counter++; } return f(x,g); } 此函数调用一个函数,该函数调用一个函数,该函数从上下文返回一个计数器并同时递增它。

使用-static-libgcc -static-libstdc ++进行编译仍会导致对libc.so的动态依赖

我正在尝试制作尽可能便携的可执行文件。 删除一些依赖项后,我在另一个系统上运行二进制文件时遇到以下问题: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.15′ not found (required by foob) /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15′ not found (required by foob) /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14′ not found (required by foob) 我更喜欢我的二进制文件不要求用户升级他们的libc版本,所以我也想删除这个依赖项。 生成上述二进制文件的链接器标志已包含-static-libgcc -static-libstdc++ 。 为什么二进制文件仍然需要共享的libc.so.6 ? 我也尝试添加-static标志,但是当我尝试运行该二进制文件时,结果非常奇怪: $ ls -l foob -rwxr-xr-x 1 claudiu claudiu 13278191 Oct 10 13:03 foob $ ./foob bash: ./foob: No such file or directory […]

在GCC中链接libssl和libcrypto

我正在尝试使用OpenSSL的EVP接口进行一些加密。 我很确定我的代码是正确的,但我似乎无法编译它。 我正在使用GCC,并且安装了libssl-dev的Ubuntu 32位精确版和最新版本。 该项目目前包含一个文件program.c 。 #include … i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha1() … ); … EVP_CIPHER_CTX_init(e_ctx); 以及其他各种电话。 这是我如何调用gcc: gcc -Wall -g -lssl -lcrypto -o program program.c 然后我得到这样的输出 /home/andy/program/program.c:31: undefined reference to `EVP_sha1′ /home/andy/program/program.c:31: undefined reference to `EVP_aes_256_cbc’ /home/andy/program/program.c:31: undefined reference to `EVP_BytesToKey’ /home/andy/program/program.c:44: undefined reference to `EVP_CIPHER_CTX_init’ 所以包含显然在起作用: andy@ProgStation2:/usr/include$ find . | grep evp.h ./openssl/evp.h […]