如何使用内存的动态分配制作(2d)数组

时间:2018-11-28 11:57:46

标签: c memory-management

我想使用动态分配内存来创建(2d)名称数组,其中每个名称的长度为1 <= name <= 1000000。

我已经尝试过了,但这是错误的,您能帮我吗

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

int main(void)
{
    int n,i;
    char *Names;

    scanf("%d",n);
    *Names=(char **)malloc(sizeof(char **)*n);

    for( i=0;i<n;i++)
        (*Names+i)=(char*)malloc(sizeof(char *)*100000);

    for(int i=0;i<n;i++)
        scanf("%s",Names[i]);
}
return 0;
}

示例输出:

/*
  kirito
  asuna
  pranav
*/

3 个答案:

答案 0 :(得分:2)

这应该可以纠正您遇到的大多数错误,大多数错误已在注释中指出。

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

int main(void)
{
    int n,i;
    /* Declare as char** */
    char **Names;

    /* Use &n to read into the address of n, otherwise you crash here */
    scanf("%d",&n);
    /* don't deference during the assignment, and you are allocating n char*, so use sizeof(char*)  */
    Names=(char **)malloc(sizeof(char *)*n);

    /* Use sizeof(char) not sizeof(char *), since here we want to store 100000 chars not 100000 pointers to char */
    for( i=0;i<n;i++)
        Names[i]=(char*)malloc(sizeof(char)*100000);

    for( i=0;i<n;i++)
        scanf("%s",Names[i]);

    /* remove extra } that was here */
    return 0;
}

答案 1 :(得分:1)

您要动态分配2D数组,但是使用单个指针。使用您的方法,您需要使用双指针

此方法动态分配字符矩阵,尺寸为N x M:

char **get(int N, int M)
{
    /* TODO: Check if allocation succeeded. (check for NULL pointer) */
    char **table;
    table = malloc(N*sizeof(char *));
    for(int i = 0 ; i < N ; i++)
        table[i] = malloc( M*sizeof(char) );
    return table;
}

您会这样称呼它:

scanf("%d", &n);
char **names = get(n, 100000);

请注意我是如何使用&n而不是n的,因为scanf()需要一个指针作为其参数。

注意:完成操作后,请不要忘记释放内存。如果不确定如何操作,我在2D dynamic array中有一个示例。


PS:Do I cast the result of malloc?不!

答案 2 :(得分:0)

严格来说,您不是在创建数组,而是创建一个指向可以通过数组语法访问的已分配内存的指针。但是,它不是一个数组。您尝试做的事情之间的差异看似肤浅,但事实并非如此。

a)不能重新放置真实数组。 b)如果是数组,则以后不必释放内存。 (适用于固定大小的数组和VLA。) c)使用动态分配时,无法通过sizeof获得整个数组的大小。