o0t*_*o0o 12 c arrays malloc struct
我将使用两组char*(或字符串)读取strtok,并且因为这两组字符是相关的,(address : command\n)所以我决定使用一个结构.
struct line* array = (struct line*)malloc(sizeof(file) * sizeof(struct line*));
Run Code Online (Sandbox Code Playgroud)
这个malloc函数的行间空间给了我一个分段错误,并想知道你是否可以告诉我一个适当的malloc空间方式.对于上下文,这是我的其余代码:
struct line
{
char* addr;
char* inst;
};
while loop{
x = strtok(line,": ");
y = strtok(NULL,"\n");
strcpy(array[i].addr,x); //assume that x and y are always 3characters
strcpy(array[i].inst,++y);
i++;
}
Run Code Online (Sandbox Code Playgroud)
Nik*_* C. 20
所有类型的分配都是相同的.如果需要分配一个line结构数组,可以使用:
struct line* array = malloc(number_of_elements * sizeof(struct line));
Run Code Online (Sandbox Code Playgroud)
在您的代码中,您分配的数组具有适当的line指针大小,而不是line结构.另请注意,没有理由强制转换返回值malloc().
请注意,它的使用方式更好:
sizeof(*array)
Run Code Online (Sandbox Code Playgroud)
代替:
sizeof(struct line)
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,如果您更改类型,分配仍将按预期工作array.在这种情况下,这不太可能,但这只是一个值得习惯的一般事情.
还要注意struct,通过typedef结构可以避免不得不一遍又一遍地重复这个词:
typedef struct line
{
char* addr;
char* inst;
} line;
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
line* array = malloc(number_of_elements * sizeof(*array));
Run Code Online (Sandbox Code Playgroud)
当然不要忘记为array.addr和分配内存array.inst.
对于您所描述的,您不需要为 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;
}
Run Code Online (Sandbox Code Playgroud)
对于结构线数组...
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);
}
}
Run Code Online (Sandbox Code Playgroud)
添加到地址注释
解决@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");
}
Run Code Online (Sandbox Code Playgroud)
变得:
for(i=0;i<10;i++)
{
line[i].addr = strdup("someString");
line[i].inst = strdup("someOtherString");
}
Run Code Online (Sandbox Code Playgroud)
还有一点要注意:上面的例子中没有包含错误处理,以避免混淆主要概念:但是为了完整起见,因为malloc() 和 strdup()都可能失败,这两个函数中的每一个的实际使用都应该在使用前包括一个测试,例如:
而不是
line[i].addr = strdup("someString");
line[i].inst = strdup("someOtherString");
Run Code Online (Sandbox Code Playgroud)
代码应该包括
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
}
Run Code Online (Sandbox Code Playgroud)