在C中遇到struct malloc问题

时间:2014-11-14 21:07:59

标签: c pointers malloc

我目前正在开始使用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内存?对不起,如果我的问题不够明确,我真的不知道如何更好地解释它。

提前致谢

5 个答案:

答案 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的类型,我不必担心在malloccalloc来电中更改相应的类型。 sizeof *test->name也是如此。根据定义,sizeof ( char ) == 1,以便calloc可以进行调用 写calloc( strlen( name ) + 1, 1 ),但我仍然喜欢明确的sizeof表达式,以防您决定使用wchar作为名称(或其他一些宽字符类型)。

  • calloc将其分配的内存清零。对于大多数类型而言,这并不重要,但在为字符串分配空间时我有意义。

  • 您应该始终检查malloccalloc来电的结果。如果您无法为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内存返回给你