c - 根据输入声明一个二维数组

标签 c

例如,我想要一个最大长度为 20 的单词数组。我从用户输入中获取要存储的单词数。声明上述数组的内存效率最高的方法是什么?

我可以做这样的事情,但我猜它的内存效率不是很高?

char wordArray[1000][20];

也就是说,我希望“1000”根据用户的输入而变化。我不能这样做。

int main()
{
    int size;
    printf("Enter size: ");
    scanf("%d", &size);
    char wordArray[size][20];
}

最佳答案

通常栈的大小很小,你不能在栈上分配这么大的内存。这样做会导致堆栈溢出。你需要动态分配。

int size;
printf("Enter size: ");
scanf("%d", &size);
char **wordArray = malloc(size*sizeof(char *));

for(int i = 0; i < size; i++)
     wordArray[i] = malloc(20);  

调用free 来解除分配。

但是,请注意,这将分配经过碎片整理的内存,而不是像二维数组那样连续分配。要获得连续的内存分配,您可以使用指向数组的指针作为

int (*wordArray)[20] = malloc(size * sizeof(*wordArray));  

并以 wordArray[i][j] 的形式访问元素。

有关更详细的解释,请阅读 c-faq 16.6: How can I dynamically allocate a multidimensional array?

关于c - 根据输入声明一个二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28543452/

相关文章:

C - 现有和定义的宏的冲突错误消息 "implicit declaration of"和 "nested extern declaration"

c - 如何解决这个匹配算法?

c - 从 C 中的指针和指向指针的指针中删除元素

c - 嵌套结构初始化

c++ - gdb:选定框架上的信息局部信息

c - 为什么这个算术表达式会产生这个结果?

c - 我应该在套接字生命周期内什么时候设置 TCP_QUICKACK 选项?

c - char *derp[20] 是什么意思?

c - 使用 realloc 减少数组时内存会发生什么情况?

c - 在此 C 代码中的何处添加循环?