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)