为什么这个小C程序在ESP32上崩溃?

时间:2018-12-11 15:01:29

标签: c

我正在使用Esspresif ESP32 WROOM开发板。我试图分析使用GDB硬件调试器收到的错误,但是我只收到发生错误的行,没有错误描述。

这是我的小程序:

typedef unsigned char u08;

void app_main() {
  static char *mac_str = "00:00:00:00:00:00";
  static u08 mac_addr[6] = {0x1a, 0x11, 0xaf, 0xa0, 0x47, 0x11};
  net_dump_mac(mac_addr);
}

void net_dump_mac(const u08 *in) {
    int pos = 0;
    for (int i=0; i<6; i++) {
        byte_to_hex(in[i], (u08 *)(mac_str+pos));
        pos += 3;
    }
    uart_send(mac_str);
}

void byte_to_hex(u08 in, u08 *out) {
    out[0] = nibble_to_hex(in >> 4);       // <= crash occurs here !
    out[1] = nibble_to_hex(in & 0xf);
}

u08 nibble_to_hex(u08 in) {
    if (in < 10)
        return '0' + in;
    else
        return 'A' + in - 10;
}

有些想法我在这里做错了吗?

1 个答案:

答案 0 :(得分:7)

char *mac_str = "00:00:00:00:00:00";将文字字符串分配给mac_str。文字在许多体系结构上都是只读的。尝试修改它会导致内存管理器不允许它,这通常会导致发生段错误或其他异常。

相反,请执行以下操作:

char mac_str[] = "00:00:00:00:00:00";

这将创建一个数组,该数组使用右侧的文字进行初始化,然后将其复制到您的数组中。该数组将是文字字符串的大小,包括空终止符。此数组变量是可修改的。