如何在不使用malloc或类似方法的情况下正确设置C中int数组的大小,以避免SIGABORT(信号-6)

vjhs03f7  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(109)

我必须创建一个给定的函数,它允许我将一个给定的数字字符串(homesize @atoi)转换为一个给定的基数(2、8、16等),并返回结果:assignment
问题是,我认为我的函数是好的,但后来它得到SIGABORT无处不在,因为事实上,我似乎无法初始化INT[]与一个有效的大小。
这是我的密码

#include <stdio.h>

int ft_atoi(char *str)
{
    int i;
    int sign;
    int num;

    i = -1;
    sign = 1;
    num = 0;
    while (str[++i] < '0' || str[i] > '9')
        if (str[i] == '-')
            sign *= -1;
    while (str[i] >= '0' && str[i] <= '9')
        num = num * 10 + str[i++] - '0';
    return (num * sign);
}

int check_base(char *base)
{
    int i;
    int z;

    i = -1;
    z = 0;
    if (base[0] == '\0' || base[1] == '\0')
        return (0);
    while (base[++i])
    {
        z = i + 1;
        if (base[i] == '+' || base[i] == '-')
            return (0);
        if (base[i] < 32 || base[i] > 126)
            return (0);
        while (base[z++])
        {
            if (base[i] == base[z])
                return (0);
        }
    }
    return (1);
}

int ft_putnbr_base(int nbr, char *base)
{
    int size_base;
    int nbr_final[(sizeof(int))]; *// I think that this is the troublemaker*
    int i;
    int final;

    i = 0;
    final = 0;
    size_base = 0;
    if (check_base(base))
    {
        if (nbr < 0)
            nbr = -nbr;
        while (base[size_base])
            size_base++;
        while (nbr)
        {
            nbr_final[i++] = nbr % size_base;
            nbr = nbr / size_base;
        }
        while (--i >= 0)
            final = final * 10 + nbr_final[i];
    }
    return (final);
}

int ft_atoi_base(char *str, char *base)
{
    return (ft_putnbr_base(ft_atoi(str), base));
}

int main(void)
{
    printf("%d", ft_atoi_base("10", "01"));  *// <== Here is where trouble begins, as soon as **str** starts to grow it fails*
}

我确实尝试过使用 valgrindgdb,但几乎没有成功(因为我不愿意分配内存?)

lnlaulya

lnlaulya1#

我复制了你的代码,清除了一些不允许我编译代码的注解,编译了代码,然后运行了示例。示例代码运行时没有任何程序转储。但是,当我将值的大小增加到以下值时:

printf("%d", ft_atoi_base("10101010", "01"));

我得到了一个堆栈粉碎错误,这意味着某个语句填充数组时超出了它的边界。
检查代码时,我看到您将一行代码标记为可疑。

int nbr_final[(sizeof(int))]; // I think that this is the troublemaker*

你的怀疑是正确的。
我添加了几个printf语句作为终端级调试器,以跟踪从ft_putnumber_base函数中的字符串派生的整数值的处理。

int ft_putnbr_base(int nbr, char *base)
{
    int size_base;
    printf("Size of integer: %ld\n", sizeof(int));          /* To note the actual size value of an int */
    int nbr_final[(sizeof(int))]; // I think that this is the troublemaker*
    int i;
    int final;

    i = 0;
    final = 0;
    size_base = 0;
    if (check_base(base))
    {
        if (nbr < 0)
            nbr = -nbr;
        while (base[size_base])
            size_base++;
        while (nbr)
        {
            printf("nbr is: %d and i is: %d\n", nbr, i);    /* To track the stack smashing */
            nbr_final[i++] = nbr % size_base;
            nbr = nbr / size_base;
        }
        while (--i >= 0)
            final = final * 10 + nbr_final[i];
    }
    return (final);
}

然后,我用更大的整数重新运行代码,并产生了这个终端输出。

@Dev:~/C_Programs/Console/Homemade/bin/Release$ ./Homemade 
Size of integer: 4
nbr is: 10101010 and i is: 0
nbr is: 5050505 and i is: 1
nbr is: 2525252 and i is: 2
nbr is: 1262626 and i is: 3
nbr is: 631313 and i is: 4
nbr is: 315656 and i is: 5
nbr is: 157828 and i is: 6
nbr is: 78914 and i is: 7
nbr is: 39457 and i is: 8
nbr is: 19728 and i is: 9
nbr is: 9864 and i is: 10
nbr is: 4932 and i is: 11
nbr is: 2466 and i is: 12
nbr is: 1233 and i is: 13
nbr is: 616 and i is: 14
nbr is: 308 and i is: 15
nbr is: 154 and i is: 16
nbr is: 77 and i is: 17
nbr is: 38 and i is: 18
nbr is: 19 and i is: 19
nbr is: 9 and i is: 20
nbr is: 4 and i is: 21
nbr is: 2 and i is: 22
nbr is: 1 and i is: 23
*** stack smashing detected ***: terminated
Aborted (core dumped)

我猜这段代码可能还有更多的问题,但这是最突出的一个。先集中精力,看看你是否能取得进展。

相关问题