我投的是 malloc 的结果吗?

在这个问题 [http://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array] 中, 有人在评论 [http://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array#comment388297_571961] 中建议, 我不应该投的结果 malloc , 即 int *sieve = malloc(sizeof(int) * length); 而不是: int *sieve = (int *) malloc(sizeof(int) * length); 为什么会出现这种情况? ……

共26个回答,已解决, 标签: c malloc casting
为什么是统计:: st _ size 0 为设备, 但同时 lseek 正确地定义了设备大小?

我注意到, 当我使用 + 查询设备的大小 open 时 lseek , 一切都没问题, 但当 stat 我使用设备时, 我得到的是零, 而不是真正的设备大小。该设备是干净的, 没有任何文件系统和设备的第一个字节开始与一些文本, 如 "1234567890ABC"。怎么了? 验证码: #include #include bool GetFileSize(const char* pPath, uint64_t& Size) { pPath = "/home/sw/.bashrc"; pPath = "/dev/sda"; struct stat buffer; if (stat(pPath, &buffer)) { printf("Failed to stat file. Error: %s. FilePath: %s\n", strerror(errno), pPath); return false; } printf("File size by stat: %" PRIu64 " WTF?\n", buffer. ……

共5个回答,已解决, 标签: c linux posix stat
允许在易失对象上进行优化

从Iso/iec 9899:201x部分5.1.2.3 计划执行第4段: > 在抽象计算机中, 所有表达式都按语义指定进行计算。实际实现不需要计算表达式的一部分, 如果它可以推断它的值没有使用, 并且不产生所需的副作用(包括因调用函数或 访问可变对象而导致的任何结果)。 对于波动对象, 这里允许的优化究竟是什么?有人能给出一个可以优化的易失性访问的例子吗? 由于挥发物的获取是一种可观察到的行为 (第6段描述), 似乎任何优化都不能对挥发性物质感到满意, 所以, 我很想知道第4节允许进行哪些优化。 ……

共5个回答,已解决, 标签: c optimization language-lawyer volatile
开关大小写: 大小写标签不会减少到整数常量

我完全知道语句背后的机制 switch , 以及为什么需要一个整数常数。我不理解的是, 为什么下面的 case 标签不被认为是整数常量。那是什么?一个不存在的变量?有人能对它进行分类吗?C 编译器真的需要如此愚蠢吗? struct my_struct { const int my_int; }; switch (4) { case ((struct my_struct) { 4 }).my_int: printf("Hey there!\n"); break; } 当然.....。 error: case label does not reduce to an integer constant case ((struct my_struct) { 4 }).my_int: 编辑回答尤金的评论: > 你的真实用例是什么?如果它是一个整数常数, 为什么要使它如此复杂? 我试图找到一个聪明的黑客来切换两个字符的字符串之间, union 使用一个而不是 a struct , 如下面的示例: #include union my_union { char ……

共5个回答,已解决, 标签: c switch-statement
语句 "int val = (+ + i > + + j)" 是否?+ i: + + j; ' 调用未定义的行为?

给出了以下程序: #include int main(void) { int i = 1, j = 2; int val = (++i > ++j) ? ++i : ++j; printf("%d\n", val); // prints 4 return 0; } 初始化似乎 val 隐藏了一些未定义的行为, 但我没有看到任何一点对象被多次修改或修改和使用, 而不需要中间的序列点。有人能纠正我, 或者证实我吗? ……

共4个回答,已解决, 标签: c ternary-operator sequence-points
如何在 C 中隐藏一些结构字段?

我试图实现一个结构的人, 我需要隐藏一些字段或使它们保持不变。创建专用字段的技巧. 头: #pragma once #define NAME_MAX_LEN 20 typedef struct _person { float wage; int groupid; } Person; const char const *getName (Person *p); int getId (Person *p); /// OTHER FUNCTIONS 源 #include "person.h" struct _person { int id; float wage; int groupid; char name[NAME_MAX_LEN]; }; /// FUNCTIONS 海合会说,person.c:7:8: error: redefinition a 'struct _person' struct _person 我可以用标题来写这个, 但之后, 我不能使用结构的字段。 typedef struct _person Person; ……

共4个回答,已解决, 标签: c typedef
如何计算 C 中的2⁶⁴/n?

如何计算整数除法, 264?假设: * unsigned long是64位 * 我们使用 64位 CPU * 1 < n < 264 如果我们这样做 18446744073709551616ul / n , 我们 warning: integer constant is too large for its type 就会在编译时得到。这是因为我们不能在 64位 CPU 中表示264。另一种方法如下: #define IS_POWER_OF_TWO(x) ((x & (x - 1)) == 0) unsigned long q = 18446744073709551615ul / n; if (IS_POWER_OF_TWO(n)) return q + 1; else return q; 是否有更快 (CPU 周期) 或更清洁 (编码) 的实现? ……

共4个回答, 标签: c integer-division
如何强制使用 int 的大小进行调试?

我有两个版本的软件, 我正在开发, 一个嵌入式系统的 int 大小是 16位, 另一个测试桌面上的一个 int 的大小是32位。我使用的是固定宽度整数类型, 但整数提升规则仍然取决于 int 的大小。 理想情况下, 我希望打印类似下面的代码 65281 (整数提升到 16位), 而不是 4294967041 (整数提升到 32位), 因为整数提升, 以便它与嵌入式系统上的行为完全匹配。我想确保在我的桌面上测试时给出一个答案的代码在嵌入式系统上给出完全相同的答案。对于 GCC 或 Clang 的解决方案都是可以的。 #include #include int main(void){ uint8_t a = 0; uint8_t b = -1; printf("%u\n", a - b); return 0; } 编辑: 我给出的例子可能不是最好的例子, 但我确实希望整数提升为 16位, 而不是32位。以下面的例子为例: #include #include #include int main(void){ uint16_t a = 0; uint ……

共3个回答,已解决, 标签: c gcc clang integer-promotion
为什么 GCC 和 Clang 的结果与下面的代码不同?

我得到了不同的结果, 下面的代码与 gcc 和 clang, 我相信这不是一个严重的错误, 但我想知道哪个结果是更一致的标准?非常感谢你的回复。 我使用 gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0 和 clang 版本 6.0.0-1ubuntu2 (tags/RELEASE_600/final) #include int get_1(){ printf("get_1\n"); return 1; } int get_2(){ printf("get_2\n"); return 2; } int get_3(){ printf("get_3\n"); return 3; } int get_4(){ printf("get_4\n"); return 4; } int main(int argc, char *argv[]) { printf("%d\n",get_1() + get_2() - (get_3(), get_4 ……

共3个回答, 标签: c gcc compiler-construction llvm
Malloc 在分配内存时是否保留了更多空间?

我正在观察我的测试程序中的以下行为: 我做 malloc() 1 MB, 然后 free() 它 sleep(10) 之后。我这样做五次。我正在 top 观察程序运行时的内存消耗。 一旦 free() -d, 我预计程序的虚拟内存 (virt) 消耗将下降 1 MB。但实际上事实并非如此。它保持稳定。这种行为的解释是什么?malloc() 在分配内存时是否会做一些保留? ……

共3个回答, 标签: c malloc free dynamic-memory-allocation
是否可以从 c#. net 调用 C 函数

我有一个 C lib, 想从 C# 应用程序调用这个库中的函数。我尝试在 C lib 上创建一个 C++/cli 包装器, 方法是将 C lib 文件添加为链接器输入, 并将源文件添加为其他依赖项。 是否有更好的方法来实现这一点, 因为我不知道如何将 C 输出添加到 c# 应用程序。 我的 C 码- __declspec(dllexport) unsigned long ConnectSession(unsigned long handle, unsigned char * publicKey, unsigned char publicKeyLen); 我的 CPP 包装机- long MyClass::ConnectSessionWrapper(unsigned long handle, unsigned char * publicKey, unsigne ……

共3个回答,已解决, 标签: c c#-4.0 interop
如何检测 C [重复] 中的整数溢出

这个问题在这里已经有了答案: * 在 C/C + 12 答案中检测签名溢出 [/questions/3944505/detecting-signed-overflow-in-c-c] * 如何检测无符号整数乘法溢出? [/questions/199333/how-do-i-detect-unsigned-integer-multiply-overflow]31个回答 我们知道, 当数字变大时, Cpithon 会将整数自动提升到长整数 (允许任意精度的算术)。 我们如何检测纯 int c 的溢出和 long long 在纯 c 中溢出? ……

共3个回答,已解决, 标签: c overflow
从已知地址访问数组

我有一个代码, 我在内存中传递了一个特定的位置。内存中的这个地方指向一个array uint32_t *ps2 = NULL; uint32_t src_address = 0x1ffffc3; 如何从该地址中读取该地址的值 array ?我试图把它投如下 *ps2 = (void *)src_address; 但它给了我一个错误:invalid conversion from ‘void*’ to ‘uint32_t 问候 ……

共3个回答, 标签: c arrays
为什么不 + + i+ + j & + k 给出预期值

我想知道为什么下面的代码中的 k 值是1。 我认为 ++i || ++j && ++k 是按照顺序执行的: ((++i || ++j) && ++k) 所以, 在第一个片段中, (++i || ++j) ++i 是真实的, 所以 ++j 不是计算, 所以 i=2 , 所以, j=1 。接下来, 在第二个片段 (true && ++k) 中, 计算 ++k , 然后. k=2 #include int main(void) { int i, j, k; i = 1; j = 1; k = 1; printf("%d ", ++i || ++j && ++k); printf("%d %d %d\n", i, j, k); return 0; } 但 printf("%d %d %d\n", i, j, k); 显示 2 1 1 我不知道是什么错了, 也不知道我误解了什么。 ……

共2个回答,已解决, 标签: c
使用 FFI 和 C 函数在红宝石中创建一个动态数组类

我想创建我自己的动态数组类在红宝石 (作为培训)。其想法是有一个类 DynamicArray 具有一个容量 (它可以在一个给定的时刻容纳的元素的数量)、一个大小 (在给定的时刻实际在数组中推送的元素的数量) 和一个静态 _ 数组, 它是固定大小的整数的静态数组.每当此静态 _ array 已满时, 我们将创建一个新的静态数组, 其容量是原始静态 _ array 的两倍, 并复制新的静态 _ array 中的每个元素。由于红宝石中没有静态数组, 我的想法是使用 FFI https://github.com/ffi/ffi [https://github.com/ffi/ffi]。在 c 中创建一个函数, 该函数创建一个大小为 n 的 int 静态数组, 然后能够在我的红宝石程序中使用它。我在 C 方面的知识很少, 很难理解 FFI 的文档这是我到目前为止所拥有的, 一个定义我的 c 函数来创建数组的创建 _ array. c 文件。 #include int * createArray ( int size ) { int array[size]; return 0; } 创建 _ arrayi ……

共2个回答,已解决, 标签: c ruby ffi
将指向原子类型的指针分配给非原子类型的指针

此代码的行为是否定义良好? #include const int test = 42; const int * _Atomic atomic_int_ptr; atomic_init(&atomic_int_ptr, &test); const int ** int_ptr_ptr = &atomic_int_ptr; printf("int = %d\n", **int_ptr_ptr); //prints int = 42 -------------------------------------------------------------------------------- 我将指向原子类型的指针分配给非原子类型的指针 (这些类型是相同的)。以下是我对此示例的想法: 《标准》明确指定 const volatile restrict 了限定符的区别和限定符 _Atomic 6.2.5(p27) : > 只要允许类型的原子版本以及类型的其他限定版本, 本标准就显式使用短语 "原子、限定或不合格类型"。"限定或不合格类型" 一词, 没有具体提及原子, 不包括原子类型。 此外, 限定类 ……

共2个回答,已解决, 标签: c concurrency language-lawyer c11 stdatomic
C 中的 "^ L" 是什么意思?

例如, main src/hello.c 在 Gnu hello 包中, 其结尾如下: exit (EXIT_SUCCESS); } ^L ……

共2个回答,已解决, 标签: c
为什么在启用优化的情况下, 此代码的速度要慢6.5倍?

出于某种原因, 我想对函数进行基准 glibc strlen 测试, 发现它显然在 GCC 中启用了优化, 执行速度要慢得多, 我不知道为什么。 这是我的代码: #include #include #include #include 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)); return 0; } 在我的机器上输出: $ gcc test.c && ./a.out 13336 $ gcc -O1 test.c && ./a.out 199004 $ gcc -O2 test.c && ./a.out 83415 $ gcc -O3 test.c ……

共2个回答,已解决, 标签: c performance gcc glibc
使用 syscall () 链接 initramfs 中的钥匙圈

我想将 IMA/EVM 的证书加载到 Linux 钥匙圈中。 相关的 shell 命令是 ima_id=`keyctl newring _ima @u` evm_id=`keyctl newring _evm @u` evmctl import /etc/keys/x509_ima.der $ima_id evmctl import /etc/keys/x509_evm.der $evm_id 这几乎适用, 除了权限问题。 # keyctl show @u Keyring 272896171 --alswrv 0 65534 keyring: _uid.0 406281657 --alswrv 0 0 \_ keyring: _ima keyctl_read: Permission denied 搜索网络时, 我发现了这个: https://github.com/systemd/systemd/issues/5522 [https://github.com/systemd/systemd/issues/5522] 解决方法是链接钥匙圈: keyctl ……

共1个回答, 标签: c linux security system-calls
在字符串中查找字符数组

我已经写了一些代码, 我相信是非常接近的答案的问题, 但我似乎不能正确地比较两个字符, 我不知道如何正确地转换它们。 我知道如何使用数组来执行此操作, 但我想知道如何使用指针来执行此操作。 char *FindToken(char *s,char *t) { while (s) { //char check = *(char*)s; tried this but it doesn't work while(t) { if (strcmp(s,t)){ //return s; printf("%s", s); } (t++); } s++; } return NULL; } 这是最初的问题。 编写一个调用的 C 函数, 该函数接受2个参数: 一个空终止字符数组 (字符串) S , 用于引用要搜索的字符串, 另一个字符串参数调用 t 。 ……

共1个回答, 标签: c