常量字符串数组

时间:2009-11-29 15:42:12

标签: c arrays string constants

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

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++;
        }
}

我正在考虑一个脚本,它自动为每个数组生成一个结构,并使用 pos data 的正确长度。内存使用方面是否有任何问题? 或者创建一个结构(如上所述)以适应所有字符串会更好吗?

3 个答案:

答案 0 :(得分:26)

我不确定我理解你的问题,但你的意思是:

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

这声明了一个指向常量字符的常量指针数组。

好的,为了避免strlen,怎么样:

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) };

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这个问题有点相关:
String Literals

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