代码之家  ›  专栏  ›  技术社区  ›  user206268

常量字符串数组

  •  7
  • user206268  · 技术社区  · 15 年前

    是否可以有一个(固定的)数组,将其元素存储在可执行文件的只读段而不是堆栈上?我提出了这段代码,但不幸的是,当涉及到添加、移动或删除项时,它是非常不灵活的。如何验证字符串是否确实存储在只读段中?我试过了 但它没有列出字符串。

    typedef struct {
            int len;
            int pos[100];
            char data[500];
    } FixedStringArray;
    
    const FixedStringArray items = {
            4,
            { 9, 14, 19, 24 },
            "LongWord1Word2Word3Word4"
    } ;
    
    char* GetItem(FixedStringArray *array, int idx, int *len) {
            if (idx >= array->len) {
                    /* Out of range */
                    *len = -1;
                    return NULL;
            }
    
            if (idx > 0) {
                    *len = array->pos[idx] - array->pos[idx - 1];
                    return & array->data[array->pos[idx - 1]];
            }
    
            *len = array->pos[idx];
            return & array->data[0];
    }
    
    void PrintItem(FixedStringArray array, int idx) {
            int len;
            char *c;
            int i = 0;
    
            c = GetItem(&array, idx, &len);
    
            if (len == -1) return;
    
            while (i < len) {
                    printf("%c", *c);
                    *c++;
                    i++;
            }
    }
    

    我正在考虑一个脚本,它自动为每个数组生成一个结构,并使用正确的长度 销售时点情报系统 数据 或者最好创建一个结构(如上所述)来适应所有字符串?

    3 回复  |  直到 15 年前
        1
  •  26
  •   Richard Pennington    15 年前

    我不太明白你的问题,但你是说:

    const char * const array[] = { "LongWord1", "Word2", "Word3", "Word4" };
    

    好吧,为了避免斯特伦,不如:

    struct Str {
        size_t len;
        char *str;
    };
    #define STR(s) { sizeof(#s) - 1, #s }
    const struct Str[] = { STR(LongWord1), STR(Word2), STR(Word3), STR(Word4) };
    
        2
  •  1
  •   DrPizza    15 年前

    你的C编译器不能把任何/所有的文本字符串都插入只读内存(例如,启用了字符串池的VC++)?或者您明确要求它们以这种方式顺序存储吗?

        3
  •  0
  •   Community leo1    7 年前

    这个问题有点相关:
    String Literals

    如前所述,ROM/RAM中字符串文本的存储依赖于平台/实现,您不应该对此进行任何预测。另外,使用脚本来读取和创建适当大小的数组并存储它们是非常不可取的。你最好去 dynamic memory .