c - arm gcc const 字符串数组未放置在rodata 中

标签 c gcc arm

关于 C 中的 ARM-GCC 当定义常量字符串数组并直接访问它时,字符串会正确放置在 .rodata 部分中。

但是,如果我有一个结构体,其指针指向放置在 .data 部分中的字符串数组并使用 ram。如何将 myStrings 放入只读部分并保存内存?

const char * myStrings[] = {"String1", "String2"};   //.rodata
const char * myStrings2[] = {"String3", "String4"};  //.data

typdef struct {
const char ** strings;
int a;
} mystruct_t;

const mystruct_t mystruct = {myStrings2,2};

void main()
{
    for(uint8_t i=0;i<2;i++)
    {
        printf("%s",myStrings[i]); 
        printf("%s",mystruct.strings[i]);
    }
}

编辑:提供了最少的代码。

最佳答案

正如@Dmitri 指出的,只有指向字符串的指针存储在 ram 中。这也可以通过将它们声明为常量来避免

const char * const myStrings2[] = {"String3", "String4"};

typdef struct {
    const char * const * strings;
    int a;
} mystruct_t;

关于c - arm gcc const 字符串数组未放置在rodata 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43419985/

相关文章:

当数据复制/扫描/读取到未初始化的指针时崩溃或 "segmentation fault"

c - 修改代码以通过引用传递

c - 一个简单的linux设备驱动程序

GCC:是否可以在使用 -pedantic 时禁用 "comma at end of enumerator list"警告?

ARM架构内核模块的交叉编译

objective-c - 为什么我不能内联这个函数?

c++ - 类成员偏移地址不正确

c++ - gcc编译错误: member of nested class A in template class Table is not visible in nested friend class. 为什么?

linux - 无法在 OSX 上编译适用于 ARM 的操作系统

c - 属性(noinline)支持需要什么 ARM 编译器版本?