C将char分配给结构

时间:2015-12-19 18:57:25

标签: c pointers struct

非常新的C,几乎是第一次。我需要在内存中创建一个结构列表,并将其指针作为函数结果传递。

这是结构:

struct ProcMemNode{
    int start;
    int end;
    char *flags;
};

代码:

struct ProcMemNode *memNode;
int start, end, file_offset, dev_major;
unsigned int dev_minor, inode;
char *flags;
fscanf(fp, "%x-%x %s %x %x:%x %u", &start, &end, flags, &file_offset, &dev_major, &dev_minor, &inode);
memNode = malloc(sizeof(struct ProcMemNode));
memNode->flags = malloc(sizeof(char) * (strlen(flags) + 1));
return memNode;

错误:

 warning: assignment makes pointer from integer without a cast [enabled by default]
         memNode->flags = (*flags);

那么,给定char * flags,如何在结构变量memNode中分配内存并为其分配flags的值?

2 个答案:

答案 0 :(得分:1)

假设您尝试保存flags指向的数据,这将有效:

struct ProcMemNode *memNode = malloc( sizeof( *memNode ) );
// error checking
memNode->flags = (some function);

假设您不必复制(some function)返回的指针所指向的数据。假设它是一个字符串,你必须复制它,你可以使用strdup()如果可用:

struct ProcMemNode *memNode = malloc( sizeof( *memNode ) );
// error checking
char *flags = (some function);
memNode->flags = strdup( flags );
// error checking

如果您因某些原因需要自己复制:

struct ProcMemNode *memNode = malloc( sizeof( *memNode ) );
// error checking
char *flags = (some function);
memNode->flags = malloc( strlen( flags ) + 1 );
// error checking
strcpy( memNode->flags, flags );

答案 1 :(得分:1)

char *flags;
flags = // something that returns pointer to string

// allocate memory needed to store flags string,
// no need to multiply by sizeof(char) - it is
// always 1, C standard does guarantee this (**)
memNode->flags = malloc((strlen(flags) + 1));
if (memNode == NULL) // always check, malloc may fail
    return NULL;
// ok, copy (***) string pointed to by flags into
// memory allocated above
strcpy(memNode->flags, flags);
return memNode->flags;

** C ++标准ISO / IEC 9899:TC2 § 6.5.3.4 sizeof运算符

  
      
  1. 当应用于具有char,unsigned char或signed char(或其限定版本)类型的操作数时,结果为1.   应用于具有数组类型的操作数,结果为总数   数组中的字节数。当应用于具有的操作数时   结构或联合类型,结果是总的字节数   这样的对象,包括内部和尾部填充。
  2.   

*** strcpy

  

STRCPY(3)Linux程序员手册
  STRCPY(3)

     

NAME          strcpy,strncpy - 复制字符串

     

概要          #include

   char *strcpy(char *dest, const char *src);

   char *strncpy(char *dest, const char *src, size_t n);
     

说明          strcpy()函数复制src指向的字符串,包括终止null          byte('\ 0'),指向dest指向的缓冲区。字符串可能不重叠,目标字符串dest必须足够大才能接收副本。小心缓冲区溢出!

你问了

为什么我不能简单地memNode->flags = flags

因为那只会将flags指向的地址分配给指针memNode->flags。但是你不希望你的memNode->flags 指向flags 相同的内存地址(只要你想要每个{{ 1}}拥有它自己的旗帜)。您希望将memNode指向的所有字符复制到另一个内存空间。所以你可以通过遍历flags字符串并逐个复制字符来实现。但是在C中实现这是一项非常常见的任务,即有标准flags函数可以为您完成。这可能的常见实现如下:

strcpy