来自不同 C 字符串数组的堆栈上的 C 字符串大小

标签 c string embedded microcontroller

我想通过 UART 发送字符串来调试 C 语言的微 Controller 程序。 现在我面临将调试字符串连接在一起的问题,因为我必须使用 c 字符串。 我需要在堆栈上有 debugMessageOnStack

考虑以下示例: 我需要一个像“我最喜欢的颜色是蒙巴顿粉色”这样的字符串

const char debugMessageStart[] = "My favorite color is ";
const char* colors[MAX_COLORS] = {[GREEN] = "green", [ORANGE] = "orange", [PINK] = "mountbatten pink"};

char debugMessageOnStack[DEBUG_MESSAGE_LENGTH];

我知道手动计算 DEBUG_MESSAGE_LENGTH 非常容易,但我希望它是动态计算的,所以我不必每次添加新的颜色字符串时都手动重新计算它比所有现有的颜色字符串都长。

理论上它应该是可能的,因为 colors 中的每个字符串长度在编译之前都是已知的,但我不知道我该怎么做。

谢谢!

最佳答案

首先,“但我希望动态计算它”没有多大意义,因为您的数组必须足够大才能处理最坏的情况。在最坏的情况下,您的代码不会因堆栈溢出而陷入困境,因此您可以简单地为该情况分配足够大的数组。

如果不是在最坏的情况下,“节省一些堆栈空间”是没有意义的,因为无论如何这只是一个局部变量,无论大小如何,在使用后都会被释放。


使用结构数组代替字符串数组:

typedef struct
{
  size_t length;
  const char* str;
} color_t;

const color_t colors[] =
{
  [GREEN] = { sizeof("green")-1, "green" },
  ...
};

这样一切都存储在闪存中并在编译时计算。如果你对减少代码重复很迂腐,那么你可以添加一个神秘的宏(一般不推荐):

#define COLOR_INIT(str) { sizeof(str)-1, str }
...
[GREEN] = COLOR_INIT("green"),

关于来自不同 C 字符串数组的堆栈上的 C 字符串大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69550570/

相关文章:

c - Xilinx SDK 中对 dlopen.dlsym、dlclose 的 undefined reference

c# - 测试空字符串不会抛出 NullReferenceException

检查 char 数组的前两个元素并发送到整数

c - volatile 和 extern 有什么区别?

c - C中删除所有小数

c - c中的scanf好像需要双输入?

c - C 中的 Malloc 断言失败

java - 在未知索引处的某些字符之间搜索子字符串

c - 嵌入式 C-UTF8 到 MARC8

rust - 如何在没有标准库的情况下旋转向量?