对于您所描述的,您不需要为 struct 分配内存,而是需要为成员分配内存char *addr;
,并且char *inst;
。如果您想拥有该结构的单个副本,代码的第一部分说明了如何初始化和分配值。如果您想要一个数组,第二个代码示例说明了差异。
这说明了如何为单个结构行的成员分配内存:
typedef struct
{
char* addr;
char* inst;
}LINE;
LINE line;
int main(void)
{
strcpy(line.addr, "anystring"); //will fail
line.addr = malloc(80);
line.inst = malloc(80);
strcpy(line.addr, "someString");//success;
strcpy(line.inst, "someOtherString");//success;
}
对于结构线数组...
typedef struct
{
char* addr;
char* inst;
}LINE; //same struct definition
LINE line[10]; //but create an array of line here.
int main(void)
{
int i;
for(i=0;i<10;i++)
{
line[i].addr = malloc(80);
line[i].inst = malloc(80);
}
for(i=0;i<10;i++)
{
strcpy(line[i].addr, "someString");
strcpy(line[i].inst, "someOtherString");
}
//when done, free memory
for(i=0;i<10;i++)
{
free(line[i].addr);
free(line[i].inst);
}
}
添加到地址注释
解决@Adam Liss 的此答案下的注释,以下代码说明了使用strdup()的以下改进:1) 仅使用所需的内存。2) 一步完成内存创建和复制操作,所以如下块:
for(i=0;i<10;i++)
{
line[i].addr = malloc(80);
line[i].inst = malloc(80);
}
for(i=0;i<10;i++)
{
strcpy(line[i].addr, "someString");
strcpy(line[i].inst, "someOtherString");
}
变得:
for(i=0;i<10;i++)
{
line[i].addr = strdup("someString");
line[i].inst = strdup("someOtherString");
}
还有一点需要注意:上面的例子中没有包含错误处理以避免混淆主要概念:但是为了完整起见,因为两者都malloc()
可能 strdup()
失败,这两个函数的实际用法应该在使用前包含一个测试,例如:
而不是
line[i].addr = strdup("someString");
line[i].inst = strdup("someOtherString");
代码应包括
line[i].addr = strdup("someString");
if(!line[i].addr)
{
//error handling code here
}
line[i].inst = strdup("someOtherString");
if(!line[i].inst)
{
//error handling code here
}