我目前正在开始使用C,并且无法为此提出解决方案。
代码:
#include <stdlib.h>
#include <string.h>
struct {
char *name;
int ID;
[...]
} example;
int currentID = 1;
int new_example(char *name){
char *the_name = malloc(strlen(name) * sizeof(char));
example *test = malloc(sizeof(example));
test->name = name;
test->ID = currentID;
currentID++;
[...]
return test->ID;
}
现在我知道我必须使用malloc(和free)作为该结构的“name”成员,以及struct本身。我现在正在做的只是为the_name分配内存,但test-&gt;名称没有为它分配内存。所以我想我的问题是,如何将test-&gt; name写入以前的malloc内存?对不起,如果我的问题不够明确,我真的不知道如何更好地解释它。
提前致谢
答案 0 :(得分:1)
为什么不做这样的事情:
example *test = malloc(sizeof(example));
test->name = malloc((strlen(name) + 1) * sizeof(char)); // +1 for null terminator
test->ID = currentID;
strcpy(test->name, name);//copy name contents
答案 1 :(得分:0)
将指针指向新内存
char *the_name = malloc((strlen(name)+1) * sizeof(char));
example *test = malloc(sizeof(example));
test->name = the_name ;
将字符串复制到其中
strcpy( test->name , name ) ;
请注意,您需要为null终止符分配一个字符:
strlen(name)+1) * sizeof(char)
答案 2 :(得分:0)
它应该类似于以下内容:
int new_example(char *name){
example *test = malloc( sizeof *test ); // or calloc( 1, sizeof *test )
if ( test ) // you should always check the result of malloc or calloc
{
test->name = calloc( strlen( name ) + 1, // + 1 for 0 terminator
sizeof *test->name );
if ( test->name )
{
strcpy( test->name, name );
test->ID = currentID;
currentID++;
[...]
return test->ID;
}
else
free( test );
}
return -1; // error indication
}
一些注意事项:
我更喜欢使用sizeof *test
而不是sizeof ( example )
;如果我更改了test
的类型,我不必担心在malloc
或calloc
来电中更改相应的类型。 sizeof *test->name
也是如此。根据定义,sizeof ( char )
== 1,以便calloc
可以进行调用
写calloc( strlen( name ) + 1, 1 )
,但我仍然喜欢明确的sizeof
表达式,以防您决定使用wchar
作为名称(或其他一些宽字符类型)。
calloc
将其分配的内存清零。对于大多数类型而言,这并不重要,但在为字符串分配空间时我有意义。
您应该始终检查malloc
和calloc
来电的结果。如果您无法为test
分配内存,那么您不应该尝试为test->name
分配内存。同样,如果你不能为test->name
分配内存,那可能表明存在不好的事情,所以你应该退出你到目前为止所做的事情。
我假设你将test
存储到[...]
部分的某个持久性结构中;如果没有,则会出现内存泄漏,因为在函数退出时会丢失test
指针。
当您释放该对象时,您将首先释放name
成员,如下所示:
void delete_example( example *ex )
{
free( ex->name );
free( ex );
}
答案 3 :(得分:-1)
没有必要将内存分配为单独的步骤(但如果必须,请记住为终止'\0'
添加另一个字节)。使用strdup()
直接指定test->name
,并使用自己的name
新副本:
int new_example(char *name){
example *test = malloc(sizeof(example));
test->name = strdup(name);
test->ID = currentID;
currentID++;
[...]
return test->ID;
}
答案 4 :(得分:-1)
DO
test->name = strdup(name);
strdup将测量字符串,malloc一些内存,复制字符串并将malloced内存返回给你