0

我有一个要求,我必须获取一个 int 的 RFID RSSI 值并将其转换为 char 指针并附加到它。下面是我是如何做到的。

char *epcBytes = (char *)tag_operation_report->tag.epc.bytes;

        int rssiString = fabs(tag_operation_report->tag.rssi);

        char *rssiVal = (char *)rssiString;

        char* rssi = "rssi";

        char *rssiResult = malloc(strlen(&rssi) + strlen(&rssiVal) + 1);
        strcpy(rssiResult, &rssi);
        strcpy(rssiResult + strlen(&rssi), &rssiVal);

        char *result = malloc(strlen(&epcBytes) + strlen(&rssiResult) + 1);
        strcpy(result, &epcBytes);
        strcpy(result + strlen(&epcBytes), &rssiResult);
        data = (void*)result;

但是我在运行代码时遇到了以下异常。

Unhandled exception at 0x00007FFBD017B2E5 (msvcr120d.dll) in RFIDTest.exe: 0xC0000005: Access violation writing location 0x0000000000000000.

我在这里做错了什么?当我在在线 C 编译器上运行它时,它运行良好。该异常在该行抛出,

strcpy(rssiResult, &rssi);
4

1 回答 1

2
  1. 你看,在 char *中它不是一个字符串类型,它只是一个指针。所以这

    char *rssiVal = (char *)rssiString;
    

    完全错误,您将整数转换为指针。这是由标准定义的,但它绝不会做你正在尝试的事情,将整数转换为你需要的字符串snprintf(),这是一个例子

    char string[100];
    int result; 
    result = snprintf(string, sizeof(string), 
        "%.0f", fabs(tag_operation_report->tag.rssi));
    if ((result < 0) || (result >= sizeof(string))
        error_please_dont_use_string();
    

    此外,如果您将值分配fabs()给.doubleintint

  2. 你正在传递一个char **指向strlen()这里的指针

    char *rssiResult = malloc(strlen(&rssi) + strlen(&rssiVal) + 1);
    /*                               ^ wrong --------^ remove them */
    

    whilestrlen()期望一个char *指向nul终止的字节序列的指针。这样做会调用未定义的行为。

  3. 你在这里再做一次

    strcpy(rssiResult, &rssi);
    /*                 ^ same problem, remove it */
    

    不同之处在于,rssi + 1&rssi + 1指针在这些函数中的任何一个中被取消引用时,未定义的行为就会发生。

  4. 看到这样的代码我很惊讶,因为编译器应该警告不兼容的指针类型,有两个可能的原因看到这个代码,它们是,要么你不编译带有像gcc-Wall这样的警告标志的代码,要么你完全忽略警告。

  5. malloc()此外,在使用指针之前,请务必检查是否成功。

注意:不要strlen()像长度存储在某处一样使用,每次调用strlen()长度时都需要计算长度,而是将长度存储在某处。这为您提供了另一个优势,而不是使用strcpy()which 将再次搜索nul终止符字节,因为您将长度存储在可以使用的地方memcpy()。您可能不会注意到任何性能改进,但至少您会知道您利用了事物的工作原理来获得更好的性能。

于 2016-01-18T11:20:39.707 回答