首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结构中的可变长度数组

结构中的可变长度数组
EN

Stack Overflow用户
提问于 2013-03-05 05:38:20
回答 2查看 11K关注 0票数 6

我正在用C编写一个应用程序(作为初学者),并且我正在努力在包含可变长度数组的结构中获取损坏的数据。我在cprogramming.com和cert.og/secure-coding上的论坛帖子中发现了类似的问题。我以为我已经找到了正确的解决方案,但似乎不是。

结构看起来像这样;

代码语言:javascript
复制
typedef struct {
    int a;
    int b;
} pair;

typedef struct {
    CommandType name;
    pair class;
    pair instr;
    pair p1;
    pair p2;
    pair p3;
    CommandType expected_next;
    char* desc;
    int size;
    pair sw1;
    pair sw2;
    pair* data;
} command;

有问题的是“命令”。对于任何给定的“命令”实例(或任何正确的短语),将设置不同的字段,尽管在大多数情况下,尽管在不同的实例中设置相同的字段。

我遇到的问题是在尝试设置expected_next、name、sw1、sw2、size和data字段时。而这是数据字段正在变得腐化。我为结构分配内存,如下所示;

代码语言:javascript
复制
void *command_malloc(int desc_size,int data_size)
{
    return malloc(sizeof(command) +
                  desc_size*sizeof(char) +
                  data_size*sizeof(pair));
}

command *cmd;
cmd = command_malloc(0, file_size);

但是,当我(漂亮地)打印结果cmd时,数据字段的中间似乎是随机垃圾。我已经使用了gdb,并且可以看到正确的数据正在加载到字段中。似乎只有当命令被传递给不同的函数时,它才会被破坏。此代码在函数中调用,例如;

代码语言:javascript
复制
command* parse(char *line, command *context)

而漂亮的打印发生在另一个函数中;

代码语言:javascript
复制
void pretty_print(char* line, command* cmd)

我认为我做的事情是正确的,但显然不是。据我所知,我构造了struct的其他实例of (我在这里复制了这些方法),但它们不包含任何可变长度数组,它们的漂亮印记看起来很好-这让我担心,因为它们也可能被破坏,但破坏不是那么明显。

我正在编写的实际上是一个解析器,所以一个命令被传递到parse函数(它描述当前状态,提示解析器下一步要做什么),然后返回下一个命令(从输入“line”派生)。"context“在parse函数的末尾是free-d,新的命令将返回它-然后通过输入的下一”行“将其传递回"parse”。

有没有人能建议一下为什么会发生这种情况?

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-05 05:40:11

您必须分别分配desc和data。

当你分配你的struct命令*cmd时,内存被分配给你的decs和data指针。Desc和data必须分开放置。

所以分配你命令

代码语言:javascript
复制
command *cmd =  malloc(sizeof(command));

然后为数据或描述分配内存

desc示例:

代码语言:javascript
复制
cmd->desc = malloc( sizeof(char )*100);
票数 9
EN

Stack Overflow用户

发布于 2014-05-02 12:24:47

当你给结构分配内存时,只有一个指针大小被分配给*desc。您必须将内存分配给desc所指向的空间(数组内容),正如有人已经指出的那样。我的回答的目的是展示稍微不同的方式。因为有一个指针*desc增加了一个字的结构大小(sizeof指针),你可以安全地在你的结构中使用可变长度的数组来减少结构的大小。

下面是您的结构应该是什么样子,请注意,desc[]已被拉到结构的末尾:

代码语言:javascript
复制
typedef struct {
    CommandType name;
    pair class;
    pair instr;
    pair p1;
    pair p2;
    pair p3;
    CommandType expected_next;
    int size;
    pair sw1;
    pair sw2;
    pair* data;
    char desc[];
} command;

现在,1.为包含数组大小的命令分配内存:

代码语言:javascript
复制
 command *cmd = malloc(sizeof(command) + desc_length);

  1. 使用desc:

cmd->descdesc_length -1 = '\0';

只有当成员在结构的末尾时,这种方法才有效,节省了结构大小,节省了指针的间接性,可以在数组长度是结构实例特定的情况下使用。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15211619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档