微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中结构中的字符串数组,无需分配

如何解决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 world\0hola mundo\0salut monde\0\0\0 ...";
// 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 world\0hola mundo\0salut monde",.params2 =
        {
                g_s.buffer + 12,g_s.buffer + 23,.numParams = 3,};

不幸的是,您需要自己计算第二个变体的偏移量(您可能会编写一个帮助脚本来为您做这件事......)。

,

线

char (*PARAM)[15];

声明一个指针 PARAM,它指向类型为 char[15] 的数组,即指向 15 个元素的数组,其中每个元素的类型为 char

你可能想写

char *PARAM[15];

声明了一个包含 15 个指针的数组,其中每个指针的类型为 char*。与前面提到的指针指向整个数组不同,这15个指针只指向一个字符。

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

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

此外,您的代码的最后一行缺少 ;

,

您可以尝试以下操作:

#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");

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。