0

我有下一个代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory>
#include <string.h>

int main()
{
    char a = 'A';
    unsigned int b = 1000;
    char* arr = (char*)malloc(sizeof(a));
    memcpy(arr, &a, sizeof(a));
    arr = (char*)realloc(arr, sizeof(arr) + sizeof(b));
    memcpy(arr + sizeof(a), &b, sizeof(b));

    const char* pData = arr;
    assert(*pData == a);
    pData += sizeof(a);
    assert(*(unsigned int*)pData == b);
    printf("finished\n");
}

此代码在带有 x86 前处理器的系统上运行良好,但在 Blackfin 设备上失败。在 Blackfin 设备上发生错误。从错误消息的第一行是:

数据访问未对齐地址违规

我读到 Blackfin 处理器在没有与字长数据对齐的情况下无法工作。然后我尝试了下一个代码:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <memory>
#include <string.h>

int main()
{
    char a[] = "AAA";
    unsigned int b = 1000;
    char* arr = (char*)malloc(sizeof(a));
    memcpy(arr, &a, sizeof(a));
    arr = (char*)realloc(arr, sizeof(arr) + sizeof(b));
    memcpy(arr + sizeof(a), &b, sizeof(b));

    const char* pData = arr + sizeof(a);
    assert(*(unsigned int*)pData == b);
    printf("finished\n");
}

此代码适用于 x86 和 Blackfin 硬件。现在我有一个问题:是否存在不是从代码手动对齐数据的方法,而是通过例如编译器选项?

感谢您的关注!

4

0 回答 0