fra*_*ess 10 c int overflow itoa
我正在针对我的itoa()函数运行一些测试用例但是继续进行
did not allocate memory for the int min value
Run Code Online (Sandbox Code Playgroud)
我正在检查,但这是我在这里缺少的东西,它是什么?
char *ft_itoa(int x) {
char *s;
size_t len;
long int n;
n = x;
if (x == -2147483648)
return (ft_strdup("-2147483648"));
len = ft_intlen(n) + 1;
if (!(s = (char*)malloc(sizeof(char) * len)))
return (NULL);
if (n == 0)
s[0] = '0';
if (n < 0) {
s[0] = '-';
n = -n;
}
s[len - 1] = '\0';
while (n) {
len--;
s[len - 1] = (n % 10) + '0';
n /= 10;
}
return (s);
}
Run Code Online (Sandbox Code Playgroud)
Art*_*Art 10
这一行:
if (x == -2147483648)
Run Code Online (Sandbox Code Playgroud)
不会做你认为它做的事情.C没有负整数常量.这是一个无符号的int常量,值为2 ^ 31,您应用一元减号运算符.这意味着表达式x == -21...将取决于编译器使用的C标准.
如果你使用C99或C11,你会没事的.有一个足够大的签名类型 - 长期保证足够大,这个数字,所以x和-21 ...将被转换为long long然后进行比较.但是如果你使用的是C89编译器并且你的机器没有足够长的类型,那么你在这里遇到了实现定义的行为:
当整数降级为具有较小大小的有符号整数,或无符号整数转换为其对应的有符号整数时,如果无法表示该值,则结果是实现定义的.
这就是人们说使用limits.h的原因.不是因为他们是迂腐,而是因为这是危险的领域.如果仔细查看limits.h包含的内容,您很可能会找到如下所示的行:
#define INT_MIN (- INT_MAX - 1)
Run Code Online (Sandbox Code Playgroud)
该表达式实际上具有正确的类型和值.
除此之外,我在您发布的代码中看不到任何错误.如果这不是问题,无论是错ft_intlen还是ft_strdup错.或者你正在调用你的函数测试错误(同样的问题适用于-21 ...调用测试时).