我想使用动态分配内存来创建(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
*/
答案 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中有一个示例。
答案 2 :(得分:0)
严格来说,您不是在创建数组,而是创建一个指向可以通过数组语法访问的已分配内存的指针。但是,它不是一个数组。您尝试做的事情之间的差异看似肤浅,但事实并非如此。
a)不能重新放置真实数组。 b)如果是数组,则以后不必释放内存。 (适用于固定大小的数组和VLA。) c)使用动态分配时,无法通过sizeof获得整个数组的大小。