C未知大小的结构

时间:2011-07-30 06:08:11

标签: c

我正在编写一个具有以下动态配置结构的应用程序:

typedef struct {
    char apphash[41];
    char filenames_count;
    char * filename[64];
} config;

但是这段代码错了,我无法弄清楚如何正确地从c-> filename [0]复制数据; c是指向配置结构的指针,动态分配,如

config * c = (config *) malloc( 42 + 64 * 2 ) // alloc for 2 filenames. can realloc() later.

如果我使用类似strcpy(c->filename[0],"file1.txt")的内容,则会出现段错误。

有人可以帮帮我吗?

目前,我正在使用直接地址计算,例如

strcpy(
    (char*) 
    ((unsigned long) c + 42 /* apphash + filenames_count */ + 
    64 * 0 /* first item */ ),
    "file1.txt"
);

当然有效。

你知道,我更喜欢汇编程序员而不是C语言,但我希望这段代码更具人性化。这段代码看起来很糟糕,因为我是C的新手。


哦,我对情况做了很糟糕的描述。对不起:(
真正的代码如下:

config * c = (config*) malloc( 42 + 64 * 2 );
// we may realloc() it later if we are going to add more filenames.

// failing example how I do copy one default filename
strcpy(c->filename[0],"file1.txt");

// working example (i386)
strcpy((char*)((unsigned long) c + 42 + 64 * 0),"file1.txt");

我使用完全静态结构类型,因为它将在下次直接从文件加载。这就是为什么我不能在结构中使用指针,我需要将真实数据放在那里 我确实检查了所有长度,没有实际代码中的BOF,我在这里省略了所有这些。

我仍然没有找到一个好的解决方案。

再次感谢并抱歉提供错误的问题信息。

4 个答案:

答案 0 :(得分:4)

我假设您拥有许多文件名,因为您拥有filenames_count。尝试

config_obj.filename[0] = strdup("file1.txt")

答案 1 :(得分:3)

在你的结构中,你正在为字符分配一个指针数组,而不是一个字符数组。你必须明确地分配指针的目标,或者至少使结构也包含字符数组:

char filename[64][MAX_PATH+1];

将MAX_PATH替换为任何文件名的最大长度。请注意,这不是一个非常优雅的解决方案,虽然非常简单,因为你浪费了很多空间。

你的直接地址计算正在做一些不同的事情:它将字符串直接放在为指针分配的空间中(这是一个非常错误的事情要做)

答案 2 :(得分:2)

现在config类型,表示您已定义的结构。您没有向我们显示引用config类型的实际变量的标识符。

所以,首先我们需要一个config类型的实例。你会做

config c;
... c.filename ...

请注意,结构访问运算符是.,或者您将执行类似

的操作
config *p = malloc(config)
/* error checking */
...c->filename ...

其中->是指针 - 解引用和访问运算符。第一种形式是首选,除非你有理由想要动态分配(唉,在c中发生了很多)。

然后你必须弄明白你想要什么filename。因为它为64个字符指针分配了空间,指向分配的内存(除了最纯粹的意外,然后不是你的意思)。你可能想要{*} char filename[64](一个文件名允许最多63个字符(为空终止留出空间))在这种情况下你会使用

strcpy(c.filename,"file1.txt");
/* or */
strcpy(p->filename,"file1.txt");

取决于您首先分配结构的方式。

如果你真的想要一个文件名的列表,那么你可能需要char *filenames[64],但是你必须为每个名字分配一个缓冲区才能使用它

c.filenames[0] = malloc(sizeOfString);
/* error checking */
strcpy(c.filenames[0],...

或另一张海报建议

c.filenames[o] = strdup(...

如果您要从多个部分构建文件名,并且可以从一开始就预测总长度,那么第一个表单可能会更好。


{*}稍后您可能想要废弃这个固定长度的缓冲区,但暂时保留它。

答案 3 :(得分:1)

目前无法正常运行,因为您没有为文件名分配内存。使用strdup或malloc + strcpy(我使用strdup)。

您的文件名字段是指向零终止字符串的指针数组。您需要为字符串分配内存并将字符串复制到该内存。您可以在其中一个指针中保存新字符串的地址,例如文件名[0]。

直接内存地址代码不起作用。它只是没有崩溃,但!该代码只会覆盖指针数组。不要写那样的代码。永远不会!!编写这样的代码在道德上等同于吃婴儿独角兽。