为具有指针成员的指针结构分配内存

时间:2018-05-24 04:20:32

标签: c malloc dynamic-memory-allocation

我正在尝试使用具有指针成员的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");
}

3 个答案:

答案 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

在你的情况下,你只有一个指针数组而不是一个双指针数组。