相关疑难解决方法(0)

正确分配多维数组

这个问题的目的是提供一个关于如何在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

51
推荐指数
1
解决办法
4882
查看次数

我应该教 C89、C18 还是别的什么?

我是一门课程的助教,我不得不用 C 语言进行速成课程,我的一个学生问,为什么我们仍然将其-ansi用作编译命令的一部分,因为它已经很老了。

现在,当我在 10 多年前学习 C 时,有人告诉我这是因为它是最广泛采用和使用的 C 标准,而且开发人员实际上并没有从 ANSI/C89 转移。我在讲座之前看过它,我能找到的所有使用方面的提及都是 2007 年或更早。但我也找不到任何更新的建议。我查看了 GitHub 上的 50 多个开源 C 项目,并且所有这些项目也在其 Make/CMAKE/WAF 配置中使用了 ANSI,所以我认为这仍然是常见的做法。 但是是吗?

我可以看到 ANSI(组织)官员在 C18。那么教学生这个更合适还是我们应该坚持使用C89?我找不到任何关于当今常见做法的文档或描述,而且我主要在使用 89 或 90 的“遗留”系统中工作。

c

7
推荐指数
1
解决办法
468
查看次数

如果我想要一个全局VLA,我可以在main函数中使用alloca()吗?

我的应用程序有一个main函数,例如,我分配配置文件的路径等。目前我使用malloc它们,但它们永远不会被释放,并且在应用程序的整个生命周期中始终可供使用。我什至从未释放它们,因为当应用程序终止时操作系统已经自动回收分配的内存。此时,是否有任何理由不使用allocamalloc 来代替,因为程序在main返回时结束,并且alloca只有在释放分配的函数后才会删除内存。因此,根据这个逻辑,在主函数中分配的内存alloca只有在程序结束时才会被释放,这是所期望的。这些陈述是否正确,是否有任何理由不使用allocaalloca 是不好的做法,所以当我说 alloca 意味着 alloca在 中创建 VLA mainmain作为“全局 VLA”之类的对象,该对象将持续到程序终止?

c alloca

2
推荐指数
1
解决办法
300
查看次数

排序时出现分段错误 - Malloc

我正在读取一个浮点数文件,然后对它们进行排序。当我对 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)

c sorting malloc segmentation-fault

0
推荐指数
1
解决办法
57
查看次数