小编jpa*_*jpa的帖子

使用GCC和bool指针的条件运算符的奇怪结果

在下面的代码中,我memset()是一个stdbool.h bool值变量123.(也许这是未定义的行为?)然后我将指向此变量的指针传递给受害者函数,该函数尝试使用条件操作来防止意外值.但是,由于某种原因,GCC似乎完全取消了条件操作.

#include <stdio.h>
#include <stdbool.h>
#include <string.h>

void victim(bool* foo)
{
    int bar = *foo ? 1 : 0;
    printf("%d\n", bar);
}

int main()
{
    bool x;
    bool *foo = &x;
    memset(foo, 123, sizeof(bool));
    victim(foo);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)
user@host:~$ gcc -Wall -O0 test.c
user@host:~$ ./a.out 
123

使这个特别恼人的是该victim()函数实际上在库中,如果值大于1则会崩溃.

转载于GCC版本4.8.2-19ubuntu1和4.7.2-5.没有在clang上复制.

c gcc conditional-operator undefined-behavior

18
推荐指数
3
解决办法
684
查看次数

在这个 C 程序中,由于某种奇怪的原因,代码中的第 5 行打印了 1.799999,这是没有意义的

#include<stdio.h>
void main(){
   printf("%f\n",5/9);  // prints 0.000000
   printf("%f\n",9.0/5.0); // prints 1.800000
   printf("%f\n",5/9);  // prints 1.799999
}
Run Code Online (Sandbox Code Playgroud)

第 5 行值应像第 3 行一样打印 0.000000

我在本地机器和在线编译器中尝试过,结果是相同的

c printf

7
推荐指数
2
解决办法
139
查看次数

你可以将"指向函数指针的指针"转换为void*

通过评论我的回答启发这里.

这一系列步骤在C标准(C11)中是否合法?

  1. 创建一个函数指针数组
  2. 一个指针指向的第一项和铸造的指针函数指针void*
  3. 对此执行指针运算 void*
  4. 将其强制转换为指向函数指针的指针并取消引用它.

或者相当于代码:

void foo(void) { ... }
void bar(void) { ... }

typedef void (*voidfunc)(void);
voidfunc array[] = {foo, bar}; // Step 1

void *ptr1 = array; // Step 2

void *ptr2 = (char*)ptr1 + sizeof(voidfunc); // Step 3

voidfunc bar_ptr = *(voidfunc*)ptr2; // Step 4
Run Code Online (Sandbox Code Playgroud)

我认为这是允许的,因为实际的函数指针只能通过正确键入的指针访问.但Andrew Henle指出,标准部分6.3.2.3似乎没有涵盖这一点:指针.

c function-pointers pointer-arithmetic language-lawyer c11

3
推荐指数
2
解决办法
199
查看次数

Protobuf可以与NanoPB进行通信

我的任务是通过蓝牙从Android设备连接到运行nanoPB的设备.

我知道NonoPB处理诸如枚举之类的证据......如果它们通过,NanoPB可以处理枚举吗?或者失败,任何Protobuf模式如"Lite"允许他们进行通信.

android protocol-buffers nanopb

2
推荐指数
1
解决办法
894
查看次数