常量字符串数组

use*_*268 7 c arrays string constants

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

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++;
        }
}
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ton 26

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

const char * const array[] = { "LongWord1", "Word2", "Word3", "Word4" };
Run Code Online (Sandbox Code Playgroud)

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

好的,为了避免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) };
Run Code Online (Sandbox Code Playgroud)


DrP*_*zza 1

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