根据您所描述的情况,您不需要为结构体分配内存,而是需要为成员变量char *addr;和char *inst;分配内存。如果您想要一个单一副本的结构体,第一段代码展示了如何初始化和赋值。如果您想要一个数组,第二个代码示例展示了不同之处。
这说明了如何为单个结构体行的成员变量分配内存:
typedef struct
{
char* addr;
char* inst;
}LINE;
LINE line;
int main(void)
{
strcpy(line.addr, "anystring");
line.addr = malloc(80);
line.inst = malloc(80);
strcpy(line.addr, "someString");
strcpy(line.inst, "someOtherString");
}
对于结构体数组行...
typedef struct
{
char* addr;
char* inst;
}LINE;
LINE line[10];
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");
}
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)
{
}
line[i].inst = strdup("someOtherString");
if(!line[i].inst)
{
}
struct line
数组分配内存不会为addr
和inst
字符串分配内存。根据struct line
里面的指针如何使用,您可能还需要为字符串数据分配内存。 - Michael Burr