我有一个struct t_args
和void*
类型
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()
一些内存并存储这个内部
请给我链接,这样我就可以向你证明。