#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <math.h>
void ip2array(const char* ip_str, uint8_t* ip_int) {
int i = 0;
char* p = (char*)ip_str;
while (*p != '\0') {
ip_int[i++] = (uint8_t)strtoul(p, &p, 10);
p++;
}
}
uint32_t ips_between (const char* start, const char* end) {
uint8_t ip[2][4];
ip2array(start, ip[0]);
ip2array(end, ip[1]);
uint32_t total = 0;
for (int i = 0; i < 4; ++i)
total += (ip[1][3 - i] - ip[0][3 - i]) * (uint32_t)pow(2, i * 8);
return total;
}
int main() {
printf("%u\n", ips_between("10.0.0.0", "10.0.0.50")); // test A
printf("%u\n", ips_between("20.0.0.10", "20.0.1.0")); // test B
}
如果我只运行测试A或测试B,程序会给出正确的结果。如果测试按顺序运行(如上所述),程序会崩溃:Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
.
我已经删除了所有动态分配的内存,并仔细检查了所有的循环。当使用调试器时,程序似乎崩溃了,就像它将总数返回给main一样。我相当肯定printf没有参与,因为我也尝试删除它。错误在三个不同的平台上都经常发生。
1条答案
按热度按时间8i9zcol21#
while循环
由于此语句,可以调用未定义的行为
当处理完字符串中的最后一个数字后 *p等于'\0'时,因为这样会访问数组ip_str之外的内存。