结构数组中的内存分配
Memory Allocation in an array of structures
airPdata **airport = malloc(sizeof(airport) * (50+1));
printf("Passes airPdata **airport\n");
// buffer = malloc(sizeof(char) * (50+1));
// puts the strings into char line
while(fgets(line, 1024, fp) != NULL)
{
// has pointer value point to line
value = line;
printf("Before creating space for struct members\n");
// creating space for the struct members
airport[j]->LocID = malloc(sizeof(char)*(50+1));
airport[j]->fieldName = malloc(sizeof(char)*(50+1));
airport[j]->city = malloc(sizeof(char)*(50+1));
printf("after\n");
我正在尝试创建一个结构数组,但我就是不知道如何为结构的成员分配内存。它一直在出现段错误。 LocID、fieldName和city都是char*
编辑***
我解决了这个问题。使用双指针不需要分配airport,但是airport的成员还是需要分配的。
// 为结构体分配内存
airPdata **机场;
// 缓冲区 = malloc(sizeof(char) * (50+1));
// puts the strings into char line
while(fgets(line, 1024, fp) != NULL)
{
// has pointer value point to line
value = line;
printf("Yes\n");
// creating space for the struct members
airport[j]->LocID = malloc(sizeof(char)*(50+1));
airport[j]->fieldName = malloc(sizeof(char)*(50+1));
airport[j]->city = malloc(sizeof(char)*(50+1));
j++;
}
然而,程序在第二次绕while循环返回并遇到airport[j]->LocID = malloc
时出现seg错误
您正在混合执行此操作的 2 种方法。
A 你有一组连续的机场
airports -----> ap1 | ap2 | ap3
B 你有一个指向机场的指针数组(不一定在内存中彼此相邻
airports --> aptr1 | aptr2 | aptr3
| | |
v v v
ap1 ap2 ap3
你的 malloc 混合了 A 和 B。如果你想要 A
做
airPdata *airport = malloc(sizeof(airport) * (50+1));
如果你想让B做
airPdata **airport = malloc(sizeof(airport*) * (50+1));
然后您还必须为每个指针槽分配一个机场对象。
OP 的代码最大的失败是没有为每个 airport[i]
分配内存
使用 airPdata **airport
和 ,代码需要在 2 级分配并使用 arrray.
数组的内存airport[]
分配给 airport[i]
的每个元素的内存(OP 错过了这部分。)
分配给各个成员的内存,例如 airport[i].LocID
数组 airport
的内存很简单,如下所示。 airPdata **airport
是指针而不是数组。而是使用 array 因为这是既定的设计目标。
// define array element count.
#define AIRPORT_N 100
// Declare the array.
airPdata *airport[AIRPORT_N];
// Keep tack of how much of the array is used.
size_t n = 0;
现在分配、读取并开始填充数组,根据需要进行分配。
#define AIRPORT_STRING_SIZE (50 + 1)
char line[1024];
while(n < AIRPORT_N && fgets(line, sizeof line, fp)) {
// Allocate memory for one element of `airport`
// Notice no cast nor type coded here.
airport[n] = malloc(sizeof *(airport[n]));
if (airport[n] == NULL) {
// Something simple for now.
fprintf(stderr, "OOM\n");
break;
}
// Create space for each string,
// TODO: add check for Out-of-Memory
airport[n]->LocID = malloc(AIRPORT_STRING_SIZE);
airport[n]->fieldName = malloc(AIRPORT_STRING_SIZE);
airport[n]->city = malloc(AIRPORT_STRING_SIZE);
// Code to parse `line` into `airport[n]` members.
// Usually the parsing happens first and if successful, the above allocations occur.
// If the `LocID` string (and others) need not change then
// use below to allocate a right-sized memory
// after parsing instead of allocating to some max size, like above.
airport[n]->LocID = strdup(LocID_string);
n++;
}
稍后全部释放
for (size_t i = 0; i < n; i++) {
free(airport[i]->LocID);
free(airport[i]->fieldName);
free(airport[i]->city);
free(airport[i]);
}
细节:注意下面的细微错误。它分配给 airport
的大小,类型为 airPdata **
.
相反,它应该分配 * airport
的大小,类型为 airPdata *
。
很常见的是,所有类型的对象指针都具有相同的大小,但在 C 中并没有在所有类型中指定这种相同性。
最好分配给取消引用的指针的大小,而不是分配给类型。它更有可能编码正确,更容易审查和维护。
// airPdata **airport = malloc(sizeof(airport) * (50+1));
airPdata **airport = malloc(sizeof *airport * (50+1));
airPdata **airport = malloc(sizeof(airport) * (50+1));
printf("Passes airPdata **airport\n");
// buffer = malloc(sizeof(char) * (50+1));
// puts the strings into char line
while(fgets(line, 1024, fp) != NULL)
{
// has pointer value point to line
value = line;
printf("Before creating space for struct members\n");
// creating space for the struct members
airport[j]->LocID = malloc(sizeof(char)*(50+1));
airport[j]->fieldName = malloc(sizeof(char)*(50+1));
airport[j]->city = malloc(sizeof(char)*(50+1));
printf("after\n");
我正在尝试创建一个结构数组,但我就是不知道如何为结构的成员分配内存。它一直在出现段错误。 LocID、fieldName和city都是char*
编辑*** 我解决了这个问题。使用双指针不需要分配airport,但是airport的成员还是需要分配的。
// 为结构体分配内存 airPdata **机场;
// 缓冲区 = malloc(sizeof(char) * (50+1));
// puts the strings into char line
while(fgets(line, 1024, fp) != NULL)
{
// has pointer value point to line
value = line;
printf("Yes\n");
// creating space for the struct members
airport[j]->LocID = malloc(sizeof(char)*(50+1));
airport[j]->fieldName = malloc(sizeof(char)*(50+1));
airport[j]->city = malloc(sizeof(char)*(50+1));
j++;
}
然而,程序在第二次绕while循环返回并遇到airport[j]->LocID = malloc
您正在混合执行此操作的 2 种方法。
A 你有一组连续的机场
airports -----> ap1 | ap2 | ap3
B 你有一个指向机场的指针数组(不一定在内存中彼此相邻
airports --> aptr1 | aptr2 | aptr3
| | |
v v v
ap1 ap2 ap3
你的 malloc 混合了 A 和 B。如果你想要 A
做
airPdata *airport = malloc(sizeof(airport) * (50+1));
如果你想让B做
airPdata **airport = malloc(sizeof(airport*) * (50+1));
然后您还必须为每个指针槽分配一个机场对象。
OP 的代码最大的失败是没有为每个 airport[i]
使用 airPdata **airport
和
数组的内存airport[]
分配给 airport[i]
的每个元素的内存(OP 错过了这部分。)
分配给各个成员的内存,例如 airport[i].LocID
数组 airport
的内存很简单,如下所示。 airPdata **airport
是指针而不是数组。而是使用 array 因为这是既定的设计目标。
// define array element count.
#define AIRPORT_N 100
// Declare the array.
airPdata *airport[AIRPORT_N];
// Keep tack of how much of the array is used.
size_t n = 0;
现在分配、读取并开始填充数组,根据需要进行分配。
#define AIRPORT_STRING_SIZE (50 + 1)
char line[1024];
while(n < AIRPORT_N && fgets(line, sizeof line, fp)) {
// Allocate memory for one element of `airport`
// Notice no cast nor type coded here.
airport[n] = malloc(sizeof *(airport[n]));
if (airport[n] == NULL) {
// Something simple for now.
fprintf(stderr, "OOM\n");
break;
}
// Create space for each string,
// TODO: add check for Out-of-Memory
airport[n]->LocID = malloc(AIRPORT_STRING_SIZE);
airport[n]->fieldName = malloc(AIRPORT_STRING_SIZE);
airport[n]->city = malloc(AIRPORT_STRING_SIZE);
// Code to parse `line` into `airport[n]` members.
// Usually the parsing happens first and if successful, the above allocations occur.
// If the `LocID` string (and others) need not change then
// use below to allocate a right-sized memory
// after parsing instead of allocating to some max size, like above.
airport[n]->LocID = strdup(LocID_string);
n++;
}
稍后全部释放
for (size_t i = 0; i < n; i++) {
free(airport[i]->LocID);
free(airport[i]->fieldName);
free(airport[i]->city);
free(airport[i]);
}
细节:注意下面的细微错误。它分配给 airport
的大小,类型为 airPdata **
.
相反,它应该分配 * airport
的大小,类型为 airPdata *
。
很常见的是,所有类型的对象指针都具有相同的大小,但在 C 中并没有在所有类型中指定这种相同性。
最好分配给取消引用的指针的大小,而不是分配给类型。它更有可能编码正确,更容易审查和维护。
// airPdata **airport = malloc(sizeof(airport) * (50+1));
airPdata **airport = malloc(sizeof *airport * (50+1));