我正在尝试使用具有指针成员的struct指针进行读取和打印。所以我试图读取并打印双结构指针数组。 我尝试了下面但是它给了我错误说"访问违规写入位置(在内存中的某个地方)"
如何为此动态分配内存?
#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
typedef struct template{
char *name;
int *birthdate;
int *phoneNum;
} detailsOf;
void inputValue(detailsOf **person, int maxSize);
int main() {
detailsOf **person;
int maxSize = 0, menu = 0;
printf("Max:");
scanf("%d", &maxSize);
person = (detailsOf **)malloc(maxSize * sizeof(detailsOf **));
if (person == NULL) {
printf("Failed to allocate");
exit(0);
}
for (int i = 0; i < maxSize; i++) {
person[i]->name = (char *)calloc(21, sizeof(char ));
person[i]->birthdate = (int *)calloc(8, sizeof(int ));
person[i]->phoneNum = (int *)calloc(16, sizeof(int ));
}
inputValue(person, maxSize);
for (int i = 0; i < maxSize; i++) {
free(person[i]);
for (int j = 0; j < 21; j++) {
free(person[i]->name[j]);
}
for (int j = 0; j < 15; j++) {
free(person[i]->phoneNum[j]);
}
for (int j = 0; j < 8; j++) {
free(person[i]->birthdate[j]);
}
}
return 0;
}
void inputValue(detailsOf **person, int maxSize) {
for (int i = 0; i < maxSize; i++) {
printf("Name of %d", i + 1);
scanf("%s", person[i]->name);
for (int j = 0; j < 8; j++) {
printf("Birth %d:", i + 1);
scanf("%d", person[i]->birthdate[j]);
}
for (int k = 0; k < 8; k++) {
printf("Phone %d:", i + 1);
scanf("%d", person[i]->phoneNum[k]);
}
}
printf("SUCCESS\n");
}
答案 0 :(得分:1)
person = (detailsOf **)malloc(maxSize * sizeof(detailsOf **));
应该是
person = malloc(maxSize * sizeof(detailsOf *));
然后,这个分配的内存来保存指向detailsOf
的指针,但是你从不为每个detailsOf
分配内存
for(int i=0; i<maxSize; i++)
{
person[i]=malloc(sizeof(detailsOf));
}
此外,你的内存释放应该是
for (int i = 0; i < maxSize; i++)
{
free(person[i]->name);
free(person[i]->phoneNum);
free(person[i]->birthdate);
free(person[i]);
}
free(person);
请注意,在释放时,只需将free
来电与malloc
来电匹配。
答案 1 :(得分:0)
规则很简单 - 指针是未初始化,直到它为其分配了有效地址,或者已分配内存以存储内容和新内存块的起始地址分配给它。
您为maxSize
分配了person
指针,但在分配struct
之前,无法为每个person[i]
分配name
等等..
所以你必须分配一个结构,例如在尝试分配pointer[i] = malloc (sizeof *pointer[i])
之前person[i]->name = calloc(21, sizeof(char ));
,...
另请注意,如果您根据derefernced指针的大小进行分配 - 您永远不会错误地分配,(person
的分配只能作为快乐事故的结果),相反,例如
person = malloc (maxSize * sizeof *person);
...
person[i] = malloc (sizeof *person[i]);
(并注意[]
或->
计算为取消引用)
person[i]->name = calloc (21, sizeof *person[i]->name);
没有必要强制转换malloc
,这是不必要的。请参阅:Do I cast the result of malloc?
答案 2 :(得分:0)
<pre>
[
1:{taxCalculation: 39.95, taxId: "3"},
2:{taxCalculation: 10, taxId: "3"},
5:{taxCalculation: 0.48, taxId: "2"}
]
</pre>
这会分配一个双指针数组,类型为person = (detailsOf **)malloc(maxSize * sizeof(detailsOf **));
,数组大小为detailsOf
。
maxSize
是地址的大小,它不会为您提供用户定义的数据类型sizeof(detailsOf**)
的大小。
另外,双指针意味着,它是一个地址位置,它将存储指向detailsOf
的内存位置的另一个指针的地址
detailsOf
在你的情况下,你只有一个指针数组而不是一个双指针数组。