C memcpy 在运行时崩溃

Posted

技术标签:

【中文标题】C memcpy 在运行时崩溃【英文标题】:C memcpy crashing at run time 【发布时间】:2021-06-09 09:47:27 【问题描述】:

我有这个问题。 每当我尝试调用 StorageStore 时,它​​都会在运行时崩溃。 我不知道如何解决它。 我试过谷歌搜索,但我对指针有点缺乏经验。 提前致谢。

编辑:我用 gcc -Ofast 编译

uint8_t Storage[256];

typedef struct _QCPU 
    uint8_t pc; // 1
    uint8_t *regs; // 7
    uint8_t *dCache; // 8 (32)
    uint8_t *iCache; // 8 (32)
    uint8_t **port_table; // 8 (8)
    void *str_load; // 8 (1)
    void *str_store; // 8 (1)
    struct Flags flags;
 QCPU;

void StorageStore(QCPU *CPU, uint8_t Addr)

    memcpy(Storage+(Addr & 0xE0), CPU->dCache, 32);


QCPU* init()

    return (QCPU*) malloc(sizeof(QCPU)); // Return Allocated Pointer To QCPU


int main()

    QCPU *cpu = init();
    cpu->dCache[3] = 5;
    StorageStore(cpu, 5);
    free(cpu);

【问题讨论】:

指针不是数组。 cpu->dCache[3] = 5; 取消引用未初始化的指针cpu->dCache,然后写入找到5 的随机地址。 CPU->dCache 是一个未初始化的指针。 您可能会发现clang.llvm.org/docs/MemorySanitizer.html 很有帮助。 don't cast malloc 【参考方案1】:

在谷歌上搜索了未初始化的指针是什么之后 我意识到我的问题

谢谢你,Paul Hankin 和 Jiri Volejnik 的回答

我添加了这些行来修复它

QCPU* init()

    QCPU* r = malloc(sizeof(QCPU)); // Allocated Pointer To QCPU
    r->dCache = malloc(32);
    r->iCache = malloc(32);
    r->port_table = malloc(8);
    return r;

【讨论】:

如果总是32,你也可以在结构中写uint8_t dCache[32];

以上是关于C memcpy 在运行时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

C程序在GDB中工作,单独运行时崩溃

当回溯从零开始时如何调试崩溃

C程序在GDB中运行,在自己运行时崩溃

C# / C++ 应用程序在从 Windows 运行时崩溃,而不是从 Visual Studio 运行

memcpy() 给我段错误

将旧项目从 C++Builder 10.2 迁移到 10.2.3 在运行时崩溃