gpt4 book ai didi

c - 尝试将 char 指针附加到固定字符串时出现内存异常

转载 作者:太空宇宙 更新时间:2023-11-04 08:17:50 25 4
gpt4 key购买 nike

我有一个要求,我必须获取 RFID RSSI 值,它是一个 int 并将其转换为 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);

最佳答案

  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() 返回 double 而不是 int,因此如果您将值分配给 int<,则有溢出的风险.

  2. 您正在将 char ** 指针传递给此处的 strlen()

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

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

  3. 然后你在这里再做一次

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

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

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

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

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

关于c - 尝试将 char 指针附加到固定字符串时出现内存异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34853481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com