繁体   English   中英

在C中分配一个二维数组,其中一维固定

[英]Allocate a 2d array in C with one dimension fixed

我想动态分配2D数组的1维(给出另一个维度)。 这有用吗:

int NCOLS = 20;

// nrows = user input...

double *arr[NCOLS];

arr = (double *)malloc(sizeof(double)*nrows);

并释放它:

free(arr)

不完全 - 你声明的是一个指针数组。 你想要一个指向数组的指针,它将被声明为:

double (*arr)[NCOLS];

然后,你就像这样分配它:

arr = malloc(nrows * sizeof(double[NCOLS]));

然后可以通过NCOLS 2D阵列将其视为正常的nrows 要释放它,只需像任何其他指针一样将其传递给free

在C中,不需要转换malloc的返回值,因为从void*到任何指针类型的隐式转换(在C ++中不是这样)。 事实上,由于存在隐式声明,这样做可以掩盖错误,例如未能#include <stdlib.h> ,因此不鼓励这样做。

数据类型double[20]是“ double数组20, double double (*)[20]是指向double数组20的指针cdecl(1)程序非常有助于解密复数C声明( 例子 )。

一个例子:

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

#define COLS 2

void func(int (**arr)[COLS], int rows)
{
    int i, j;

    *arr = malloc(sizeof(int[COLS]) * rows);
    printf("Insert number: \n"); 
    for(i = 0; i < rows; i++) 
        for(j = 0; j < COLS; j++) 
            scanf("%d", &(*arr)[i][j]);
    for(i = 0; i < rows; i++) 
        for(j = 0; j < COLS; j++) 
            printf("%d\n", (*arr)[i][j]);
}


int main(void)
{ 
    int (*arr)[COLS];

    func(&arr, 2);
    free(arr);
    return 0;
} 

您必须在第一维上为每个元素(每个元素是一个指向数组的指针)分配一个新数组。 您可以使用循环:

for(i = 0; i < NCOLS; i++)
   arr[i] = (double *)malloc(sizeof(double)*nrows);

做同样的自由。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM