C语言 我的代码运行良好,测试A或测试B被注解掉,但两者都运行程序崩溃

jucafojl  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(115)
#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没有参与,因为我也尝试删除它。错误在三个不同的平台上都经常发生。

8i9zcol2

8i9zcol21#

while循环

while (*p != '\0') {
    ip_int[i++] = (uint8_t)strtoul(p, &p, 10);
    p++;
}

由于此语句,可以调用未定义的行为

p++;

当处理完字符串中的最后一个数字后 *p等于'\0'时,因为这样会访问数组ip_str之外的内存。

相关问题