我们如何正确地多次动态分配内存?

时间:2018-01-22 10:34:28

标签: c pointers memory memory-management

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

#define MAX_STRING_SIZE 20

int main() {

/* Enter your code here. Read input from STDIN. Print output to STDOUT */    
int N, Q;
int i, j, k, l, m, x;
char **str;
scanf("%d\n", &N);
str = (char **)malloc(sizeof(char *) * N);
for(i = 0; i < N; i++){
    str[i] = malloc(MAX_STRING_SIZE * sizeof(char));
    scanf("%s",str[i]);
}
printf("%d\n",N);   
for(j = 0; j < N; j++){
    printf("%s",str[j]);
    printf("\n");
}
scanf("%d",&Q);
printf("%d\n",Q);
char **qry_str;
qry_str = (char **)malloc(sizeof(char *) * Q);
for(l = 0; l < Q; l++){
    qry_str = malloc(MAX_STRING_SIZE * sizeof(char));
    scanf("%s",qry_str[l]);
}   
for(m = 0; m < N; m++){
    printf("%s",qry_str[m]);
    printf("\n");
}

for(k = 0; k < N; k++)
    free(str[k]);
free(str);
for(x = 0; x < N; x++)
    free(qry_str[x]);
free(qry_str);
return 0;
}

我是编程的新手,我正在尝试使用malloc函数为两个2d字符串分配内存,但是当我尝试输入第二个字符串qry_str的数据时,屏幕上会出现(null),程序退出。

我的问题是:

  1. 我们如何在C中多次为2D数组动态分配内存?
  2. 在再次使用之前,是否需要先释放内存? (虽然当我尝试这样做时会导致分段错误错误。)
  3. 这是问题,因为我的编译器? (我正在使用gcc。)

1 个答案:

答案 0 :(得分:1)

在你的第二种情况下,你在循环中覆盖qry_str,这不是预期的。你最想要的是

for(l = 0; l < Q; l++){
    qry_str[l] = malloc(MAX_STRING_SIZE * sizeof(char));
    scanf("%s",qry_str[l]);
 }    

那说,一些建议:

  • 您不需要四个单独的计数器ijlmfor语句的第一个子句无论如何都会将计数器重新分配给0,即使您只重用一个。
  • sizeof(char)被保证在C中为1。相反,你应该考虑写一下这样的陈述

     qry_str[l] = malloc(MAX_STRING_SIZE * sizeof *qry_str));
    

    使它们更健壮。

  • 始终检查scanf()系列的返回值,以确保成功。