我正在编写一个具有以下动态配置结构的应用程序:
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,我在这里省略了所有这些。
我仍然没有找到一个好的解决方案。
再次感谢并抱歉提供错误的问题信息。
答案 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]。
直接内存地址代码不起作用。它只是没有崩溃,但!该代码只会覆盖指针数组。不要写那样的代码。永远不会!!编写这样的代码在道德上等同于吃婴儿独角兽。