【问题标题】:How do we correctly dynamically allocate memory multiple times?我们如何正确地多次动态分配内存?
【发布时间】:2018-01-22 10:34:27
【问题描述】:
#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 函数为两个二维字符串分配内存,但是当我尝试为第二个字符串 qry_str 输入数据时,屏幕上出现 (null),程序退出。

我的问题是:

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!请正确缩进您的代码。机器(编译器)可以读取和编译任何东西,但是对于人类来说,它需要在将文本块读取为 code 时做出一点sense。提问时,文本区域右侧有一个橙色的大如何格式化框。还有一个完整的格式化辅助工具栏。还有一个 [?] 按钮提供格式化帮助。还有一个预览区域,显示您的帖子发布后的样子。使您的帖子清晰,并证明您花时间这样做,可以提高您获得好答案的机会。

标签: c pointers memory memory-management


【解决方案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() family 的返回值以确保成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-13
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2016-08-06
    • 2017-05-08
    • 2012-07-19
    相关资源
    最近更新 更多