这个问题的目的是提供一个关于如何在C中动态正确分配多维数组的参考.这是一个经常被误解的主题,即使在一些C编程书籍中也很难解释.因此,即使是经验丰富的C程序员也很难做到正确.
我从编程教师/书籍/教程中了解到,动态分配多维数组的正确方法是使用指针指针.
然而,SO上的几个高代表用户现在告诉我这是错误和不好的做法.他们说指针到指针不是数组,我实际上并没有分配数组,而且我的代码不必要地慢.
这就是我教我分配多维数组的方法:
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
int** arr_alloc (size_t x, size_t y)
{
int** pp = malloc(sizeof(*pp) * x);
assert(pp != NULL);
for(size_t i=0; i<x; i++)
{
pp[i] = malloc(sizeof(**pp) * y);
assert(pp[i] != NULL);
}
return pp;
}
int** arr_fill (int** pp, size_t x, size_t y)
{
for(size_t i=0; i<x; i++)
{
for(size_t j=0; j<y; j++)
{
pp[i][j] = (int)j + 1;
}
}
return pp;
}
void arr_print (int** pp, size_t x, size_t y) …Run Code Online (Sandbox Code Playgroud) c arrays dynamic-arrays dynamic-allocation variable-length-array
我是一门课程的助教,我不得不用 C 语言进行速成课程,我的一个学生问,为什么我们仍然将其-ansi用作编译命令的一部分,因为它已经很老了。
现在,当我在 10 多年前学习 C 时,有人告诉我这是因为它是最广泛采用和使用的 C 标准,而且开发人员实际上并没有从 ANSI/C89 转移。我在讲座之前看过它,我能找到的所有使用方面的提及都是 2007 年或更早。但我也找不到任何更新的建议。我查看了 GitHub 上的 50 多个开源 C 项目,并且所有这些项目也在其 Make/CMAKE/WAF 配置中使用了 ANSI,所以我认为这仍然是常见的做法。 但是是吗?
我可以看到 ANSI(组织)官员在 C18。那么教学生这个更合适还是我们应该坚持使用C89?我找不到任何关于当今常见做法的文档或描述,而且我主要在使用 89 或 90 的“遗留”系统中工作。
我的应用程序有一个main函数,例如,我分配配置文件的路径等。目前我使用malloc它们,但它们永远不会被释放,并且在应用程序的整个生命周期中始终可供使用。我什至从未释放它们,因为当应用程序终止时操作系统已经自动回收分配的内存。此时,是否有任何理由不使用allocamalloc 来代替,因为程序在main返回时结束,并且alloca只有在释放分配的函数后才会删除内存。因此,根据这个逻辑,在主函数中分配的内存alloca只有在程序结束时才会被释放,这是所期望的。这些陈述是否正确,是否有任何理由不使用alloca(alloca 是不好的做法,所以当我说 alloca 意味着 alloca或在 中创建 VLA main)main作为“全局 VLA”之类的对象,该对象将持续到程序终止?
我正在读取一个浮点数文件,然后对它们进行排序。当我对 100 万个数字使用以下排序和交换函数时,我能够成功地对数字进行排序。但是,当我尝试对 1 亿个数字进行排序时,出现分段错误。我不知道为什么,因为我正在动态分配内存。我如何能够处理超过 100 万个数字?
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
void swap(float *a, float *b, size_t n) {
size_t numbytes;
size_t sz = sizeof(float);
void *temp = NULL;
numbytes = n * sz;
if (numbytes == 0){
exit(EXIT_FAILURE);
}
temp = malloc(numbytes);
memcpy(temp, a, numbytes);
memcpy(a,b,numbytes);
memcpy(b,temp,numbytes);
free(temp);
}
void radixSort(float array[], size_t count) {
int numOfZero = 0;
float a[count];
float *b = a;
for (uint32_t radix=1; radix; radix<<=1) { //unsigned int 32 bit
uint32_t *arrayToInt …Run Code Online (Sandbox Code Playgroud)