摞代码的猴哥 2024-02-29 16:15 采纳率: 0%
浏览 7

C语言字符串指定flash存储地址的问题

const char *pstr = "well";
const char str[] = "hello";

在编译的时候,"hello"可以使用__attribute__(section(".MyRodata"))的方式,将数组指定到.MyRodata区域,但是此方法对"well"这种没有赋值到数组的字符串无效,"well"最终由编译器控制放到了.rodata.str1.4类似的区域,请问有方法指定"well"这种数组的flash存放地址或者存储区吗?

  • 写回答

3条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-02-29 16:16
    关注

    摞代码的猴哥 下午好🌅🌅🌅
    本答案参考通义千问

    **在C语言中,char *pstr = "well";这样的字符串字面量实际上是存放在常量区(.rodata)的,并不会像数组那样被分配在栈或堆上。**对于这种情况,如果你想改变pstr指向的字符串的存储位置,通常有以下几种方法:

    1. 静态初始化数组:char str[] = "hello"改为const char str[] = "hello",这样字符串就会被静态存储在.rodata区域,与pstr指向的字符串类似。

    2. 动态内存分配: 使用malloc()calloc()为字符串分配内存,然后复制"well"到这个内存块。例如:

      char *pstr = malloc(strlen("well") + 1);
      strcpy(pstr, "well");
      

      注意要确保释放内存,避免内存泄漏。

    3. 使用__attribute__((section)) 如果你想要将pstr指向的字符串放入特定的内存区域,如.MyRodata,你需要将它放在一个全局变量或者结构体中,然后使用__attribute__((section(".MyRodata")))来标记。但这只适用于char *指向的字符串,对字面量无效。例如:

      extern __attribute__((section(".MyRodata"))) char myString[] = "well";
      char *pstr = myString;
      
    4. 使用__attribute__((section))extern 另一种可能的方法是先定义一个全局变量,然后在其他地方使用extern声明,但这样不能直接改变字符串字面量的位置,只能改变指针的指向。

    请注意,改变字符串存储位置可能会导致链接器错误或程序行为不可预测,因为这些操作可能违反了编译器的优化策略。除非有特殊的需求,否则通常不推荐这样做。

    评论

报告相同问题?

问题事件

  • 修改了问题 2月29日
  • 创建了问题 2月29日

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值