相关文章推荐
霸气的酸菜鱼  ·  Ubuntu 安装postgresql - ...·  5 月前    · 
帅气的毛衣  ·  vue elementUI ...·  8 月前    · 
不拘小节的砖头  ·  CentOS7 ...·  1 年前    · 

linux gdb调试时,使用p命令打印一个(void *)变量时会报错:
Attempt to dereference a generic pointer.
此时,只需要将(void *)变量强制类型转化成需要打印的类型,使用p命令即可打印。
例如,需要打印(int *)型entries变量,则使用命令格式:

(gdb) p *(int *)map->entries
$38 = 0

struct channel_map结构体:

* channel映射表, key为对应的socket描述字 struct channel_map { void **entries; /* The number of entries available in entries */ int nentries;

struct event_loop结构体

struct event_loop {
    int quit;
    const struct event_dispatcher *eventDispatcher;
    /** 对应的event_dispatcher的数据. */
    void *event_dispatcher_data;
    struct channel_map *channelMap;
    int is_handle_pending;
    struct channel_element *pending_head;
    struct channel_element *pending_tail;
    pthread_t owner_thread_id;
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int socketPair[2];
    char *thread_name;

使用(map)->entries的地方怎么在gdb中打印

int event_loop_handle_pending_add(struct event_loop *eventLoop, int fd, struct channel *channel) {
    yolanda_msgx("add channel fd == %d, %s", fd, eventLoop->thread_name);
    struct channel_map *map = eventLoop->channelMap;
    if (fd < 0)
        return 0;
    if (fd >= map->nentries) {
        if (map_make_space(map, fd, sizeof(struct channel *)) == -1)
            return (-1);
    //第一次创建,增加
    if ((map)->entries[fd] == NULL) {
        map->entries[fd] = channel;
        //add channel
        struct event_dispatcher *eventDispatcher = eventLoop->eventDispatcher;
        eventDispatcher->add(eventLoop, channel);
        return 1;
    return 0;

gdb打印方法:

(gdb) p *(struct channel *)map->entries[fd]
$43 = {fd = 10, events = 2, eventReadCallback = 0x402b3d <handle_connection_established>, eventWriteCallback = 0x0, data = 0x608890}
我正在试着制作一个基本的计算器,它可以执行各种算术功能,从添加开始!现在我已经掌握了它的基本逻辑,但我不确定如何接受两个输入并将其打印出来!C语言简介:添加和打印#include int main(){char mychar;int a;int op1;int op2;printf("Welcome to Andrew Hu's calculator program!\n"); //Greetin... 大家好,我想用printf进行调试。但是我不知道如何打印“out”变量。在C中打印void *变量在返回之前,我想打印这个值,但它的类型void *。inthexstr2raw(char *in, void *out) {char c;uint32_t i = 0;uint8_t *b = (uint8_t*) out;while ((c = in[i]) != '\0') {uint8_t v... param是一个自动变量.您不能将其退回并在其范围之外使用它.param仅存在于func中,如果返回,结果为Undefined Behavior.要修复它,您可以:>动态地在堆上分配param.执行此操作后,您可以安全地返回参数地址,但您必须记住在不需要它时将其释放.这是对代码的更正#include #include #include using namespace std;void * f... 在linux下的GDB环境中,用p   命令查看一个void   *型的变量的时候,提示为: "在linux下的GDB环境中,用p   命令查看一个void   *型的变量的时候,提示为: "attempt   to   dereference   a   generic   a   pointer   "  " 【关于C语言基本格式化输入、输出 (如%20[^#] )这种不常见的写法说明】针对C语言中的基本格式化输入、输出,我们常见是格式为:%[标志][宽度][.精度]类型相关说明:类型:说明数据类型是整型(d)还是字符串(s)、字符(c)、地址输出(p)等.想输出% 需要写成"%%"。标志:“-”左对齐;“+”右对齐(默认是这种方式);空格“ ” 只有当是数值型的输出才有用( 当正数时,则显示一个空格,... 在c语言中,void指针可以指向任意类型变量,但是在输出指向的变量时,不能像一般指针那样printf("%d",*p);输出,而需要进行强转输出,具体代码如下: #include<stdio.h> int main() { int a=5; void *p=&a; int *p1=&a; printf("%d\n",p); printf("%d\n",*(char*)p); printf("%d\n",p1); printf("%d\n",*p1); return 无数据类型指针:void * a)无数据类型指针(void *)概念:它也是一个指针变量,也保存一个地址,同样占4字节内存空间,只是它指向的内存区域的数据类型是不可知的,称这种指针为无数据类型指针 写法:void * void *p = &a; b)无类型指针特点: 1.通过此种指针变量是无法获知指向的内存区域保存的数据的数据类型 2.不能直接对无类型指针进行解引用操作"*",因为你不知道指向的内存区域的数据类型