0

此函数是否会释放下面代码中的in函数cleanProgram()分配的所有内存。malloc()createArray()

#include <stdio.h>
#include <stdlib.h>

typedef struct S_Array
{
    int *arr;
    int size;
}Array;

Array* createArray()
{
    Array* a = (Array*)malloc(sizeof(Array));
    printf("enter the size of array: ");
    scanf("%d",&a->size);
    a->arr = (int*)malloc(a->size*sizeof(int));
    printf("enter the array elements: ");
    for(int i=0; i<a->size; i++) {
        scanf("%d",&a->arr[i]);
    }
    return a;
}

void cleanProgram(Array *a){
    free(a->arr);
    free(a);
}

void traverse(Array *a){
    for(int i=0; i<a->size; i++){
        printf("%d ",a->arr[i]);
    }
}

int main()
{
    Array* a = createArray();
    traverse(a);
    cleanProgram(a);
    return 0;
}
4

1 回答 1

0

您正在正确释放内存,但您没有检查分配错误,因此您也有内存泄漏createArray()

#include <stdio.h>
#include <stdlib.h>

typedef struct S_Array {
  int* arr;
  int size;
} Array;

Array* createArray(void) {
  Array* a = malloc(sizeof(Array));

  // let's check for errors
  if (a == NULL) {
    return NULL;
  }

  printf("enter the size of array: ");
  scanf("%d", &a->size); // let's assume input is always correct

  a->arr = malloc(a->size * sizeof(int));

  // let's check for errors
  if (a->arr == NULL) {
    free(a); // here we avoid memory leaks
    return NULL;
  }

  for (int i = 0; i < a->size; i++) {
    printf("enter element arr[%d]: ", i); // clearer message
    scanf("%d", &a->arr[i]); // let's assume input is always correct
  }

  return a;
}

void cleanProgram(Array* a) {
  free(a->arr);
  free(a);
}

void traverse(Array* a) {
  for (int i = 0; i < a->size; i++) {
    printf("%d ", a->arr[i]);
  }
  printf("\n");
}

int main(void) {
  Array* a = createArray();

  // let's check for errors
  if (a == NULL) {
    printf("ERROR: cannot create array\n");
    return 1;
  }

  traverse(a);

  cleanProgram(a);
  return 0;
}
于 2021-09-30T08:24:58.677 回答