C中结构中的字符串数组,而不进行分配



我想用字符串数组初始化一个结构,而不进行动态分配。有可能吗?我曾想过这样的事情,但它不起作用:

struct st_request {
int GRID;
char NAME[15];
char (*PARAM)[15];
};
typedef struct st_request request;
request myrequest = {
.GRID=1,
.NAME="GLOB",
.PARAM={"RR1","RR3"}
}

一个主意?感谢您的解决方案。

有几种可能的变体,这里有两种:

struct s
{
char params1[32][64]; // 32 strings each with maximum length of 64 characters
///////////////////////////////////////////////////
char buffer[1024]; // byte buffer for individual strings
char* params2[32]; // 32 pointers you can let point
// to arbitrary positions into buffer
};

如果您不总是使用所有参数,您可能希望将size_t numparams;添加到上述两个解决方案中的任何一个。

复制时,第一个变体可以,使用第二个变体时,您必须重新调整指针:

dest.params2[n] = dest.buffer + (source.params2[n] - source.buffer);

对于第二种变体,不要忘记为终止空指针留出空间。一个有数据的结构可能看起来像这样:

buffer     == "hello worldhola mundosalut monde ...";
// first parameter  c a n  be implicit: buffer
params2[0] == buffer + 12;
params2[1] == buffer + 23;
numParams  == 3; // including the implicit parameter

或者,第一个参数可能总是指向缓冲区的开始,然后您可以一致地访问所有参数,而无需像p = n == 0 ? buffer : params[n-1]那样进行任何特殊处理。

初始化可能如下所示:

struct s g_s =
{
.params1 =
{
"hello world",
"hola mundo",
"salut monde",
},
.buffer = "hello worldhola mundosalut monde",
.params2 =
{
g_s.buffer + 12,
g_s.buffer + 23,
},
.numParams = 3,
};

不幸的是,你需要自己计算第二个变体的偏移量(你可能会为你写一个助手脚本…(

char (*PARAM)[15];

声明单个指针PARAM,该指针指向char[15]类型的数组,即指向15个元素的数组,其中每个元素都具有char类型。

你可能想写

char *PARAM[15];

其中每个指针具有类型char*。与前面提到的指向整个数组的指针不同,这15个指针只指向一个字符。

在C语言中,当处理字符串时,通常使用指向以null结尾的字符序列的第一个字符的指针。指向整个数组的指针通常只在多维数组的上下文中使用,因为计算多维数组中的偏移量需要引用对象的大小信息。

请注意,用大写写变量名称是不正常的。这通常是为常量保留的。

此外,在代码的最后一行中缺少一个;

您可以尝试以下操作:

#define PARAM_SIZE 20;
struct st_request {
int GRID;
char NAME[15];
char PARAM[15*PARAM_SIZE];
};
request myrequest = {
.GRID=1,
.NAME="GLOB"
}
strcpy (&myrequest.PARAM[0*PARAM_SIZE], "RR1");
strcpy (&myrequest.PARAM[1*PARAM_SIZE], "RR3");

相关内容

  • 没有找到相关文章

最新更新