我正在用C编写一个应用程序(作为初学者),并且我正在努力在包含可变长度数组的结构中获取损坏的数据。我在cprogramming.com和cert.og/secure-coding上的论坛帖子中发现了类似的问题。我以为我已经找到了正确的解决方案,但似乎不是。
结构看起来像这样;
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字段时。而这是数据字段正在变得腐化。我为结构分配内存,如下所示;
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,并且可以看到正确的数据正在加载到字段中。似乎只有当命令被传递给不同的函数时,它才会被破坏。此代码在函数中调用,例如;
command* parse(char *line, command *context)而漂亮的打印发生在另一个函数中;
void pretty_print(char* line, command* cmd)我认为我做的事情是正确的,但显然不是。据我所知,我构造了struct的其他实例of (我在这里复制了这些方法),但它们不包含任何可变长度数组,它们的漂亮印记看起来很好-这让我担心,因为它们也可能被破坏,但破坏不是那么明显。
我正在编写的实际上是一个解析器,所以一个命令被传递到parse函数(它描述当前状态,提示解析器下一步要做什么),然后返回下一个命令(从输入“line”派生)。"context“在parse函数的末尾是free-d,新的命令将返回它-然后通过输入的下一”行“将其传递回"parse”。
有没有人能建议一下为什么会发生这种情况?
非常感谢。
发布于 2013-03-05 05:40:11
您必须分别分配desc和data。
当你分配你的struct命令*cmd时,内存被分配给你的decs和data指针。Desc和data必须分开放置。
所以分配你命令
command *cmd = malloc(sizeof(command));然后为数据或描述分配内存
desc示例:
cmd->desc = malloc( sizeof(char )*100);发布于 2014-05-02 12:24:47
当你给结构分配内存时,只有一个指针大小被分配给*desc。您必须将内存分配给desc所指向的空间(数组内容),正如有人已经指出的那样。我的回答的目的是展示稍微不同的方式。因为有一个指针*desc增加了一个字的结构大小(sizeof指针),你可以安全地在你的结构中使用可变长度的数组来减少结构的大小。
下面是您的结构应该是什么样子,请注意,desc[]已被拉到结构的末尾:
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.为包含数组大小的命令分配内存:
command *cmd = malloc(sizeof(command) + desc_length);cmd->descdesc_length -1 = '\0';
只有当成员在结构的末尾时,这种方法才有效,节省了结构大小,节省了指针的间接性,可以在数组长度是结构实例特定的情况下使用。
https://stackoverflow.com/questions/15211619
复制相似问题