将void*强制转换为int时,传递的是地址,而不是值

  • 本文关键字:地址 void 转换 int c
  • 更新时间 :
  • 英文 :


我有一个struct t_argsvoid*类型

typedef struct  s_args
{
void    *width;
}   t_args;

我在void *中传递一个int地址。接下来,我们在相同的函数int *q = (int *)args->width;中查看t_args->width的值,它是4,一切都是正确的。但是一旦我将结构传递给";处理";函数processing(args, arg, return_len);,那么t_args->width就会变成一个巨大的数字,就好像它将十六进制地址翻译成int并将其写入int一样。在这种情况下,为什么我第一次检查t_args->width的值时,它会正确显示所有内容?

这是所有工作的功能

void        work_with_one_argument(int *i, char *str, va_list *arg, int *return_len)
{
t_args *args;
*i += 1;
if (str[*i] == '%')
{
ft_putchar(str[*i]);
*i += 1;
*return_len += 1;
}
create_struct(&args, i, str);
replace_star(args, arg);
int *q = (int *)args->width;
processing(args, arg, return_len);
}

这是t成为垃圾的函数

void            processing(t_args *args, va_list *arg, int *return_len)
{
char *types;
types = "diucpsxXnfge";
int *t = (int *)args->width;
if (!ft_memcmp(args->type, (void *)&types[0], 1) || 
!ft_memcmp(args->type, (void *)&types[1], 1) || 
!ft_memcmp(args->type, (void *)&types[2], 1))
select_handler_int_unsign(args, arg, return_len, types);

创建结构的函数

/*
**      Function:         t_args        create_struct()
**
**      Description:      function create and fill struct t_args
*/
void            create_struct(t_args **args, int *i, char *str)
{
*args = (t_args *)malloc(sizeof(t_args));
struct_initialization(args);
parse_specificators(args, i, str);
}

这是填充参数->宽度

/*
**      Function:         void      parse_spec_width()
**
**      Description:      parse width from string
*/
void            parse_spec_width(t_args **args, int *i, char *str)
{
t_args  *tmp;
char    *star;
int     width;
tmp = *args;
star = "*";
if (str[*i] == *star)
{
tmp->width = (void *)&star[0];
*i += 1;
return ;
}
if (str[*i] >= '0' && str[*i] <= '9')
{
width = ft_atoi(&str[*i]);
tmp->width = (void *)&width;
while (str[*i] >= '0' && str[*i] <= '9')
*i += 1;
}
}

我正在编写printf的实现。字符串"%05d";收到时,宽度指定符存储在空白*中

replace_star(args, arg)函数不正确。它可能从va_arg而不是整数本身获取整数指针。如果你想得到指针,你应该malloc()一些内存并存储这个内部

请给我链接,这样我就可以向你证明。

最新更新