非常新的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
的值?
答案 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运算符
- 当应用于具有char,unsigned char或signed char(或其限定版本)类型的操作数时,结果为1. 应用于具有数组类型的操作数,结果为总数 数组中的字节数。当应用于具有的操作数时 结构或联合类型,结果是总的字节数 这样的对象,包括内部和尾部填充。
醇>
*** 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