c - 如何在函数中为指针数组分配内存和赋值?

标签 c arrays pointers malloc pointer-to-pointer

我无法弄清楚如何为函数中的指针数组分配内存。在同一个函数中,我尝试使用另一个数组中的值初始化数组。一段时间以来我一直在尝试不同的事情,但我无法弄清楚我需要和不需要的地方。

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

void allocate();
void print();

int main() {

    int array_length = 10;

    int array[array_length] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    int **ascending;
    int **descending;

    allocate(&ascending, &descending, array, array_length);

    print(&ascending, &descending, array, array_length);

}

void allocate(int ***ascending, int ***descending, int array[], int array_length) {

    *ascending = (int **)malloc(array_length * sizeof(int *));
    *descending = (int **)malloc(array_length * sizeof(int *));

    int i, first_index = 0;

    for (i = 0; i < array_length; i++) {

        (*ascending)[i] = &(array[i]);
        (*descending)[i] = &(array[i]);

    }

}

void print(int **ascending, int **descending, int array[], int array_length) {

    int i;

    printf("\nAscending\tOriginal\tDescending\n\n");

    for (i = 0; i < array_length; i++) {

        printf("%d\t\t", ascending[i]);
        printf("%d\t\t", array[i]);
        printf("%d\t\t", descending[i]);

        printf("\n");

    }

    printf("\n");

}

最佳答案

首先,可变大小的数组不能被初始化。您应该对 array_length 使用 MACRO。

然后,根据您的函数定义,对 print() 的调用需要 int ** 作为前两个参数,而不是 int ***.将函数调用更改为

  print(ascending, descending, array, array_length);

此外,ascending[i]descending[i],在本例中,都是 int * 类型,您还需要一个获取 int 的取消引用级别。

也就是说,

void allocate();
void print();

的前向声明。您应该使用函数的精确签名进行声明和定义。

<小时/>

示例工作版本可能看起来像这样

//gcc 4.9.3

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

#define arraysize 10

void allocate(int ***ascending, int ***descending, int array[], int array_length);
void print(int **ascending, int **descending, int array[], int array_length);

int main(void) {

    int array_length = arraysize;

    int array[arraysize] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    int **ascending;
    int **descending;

    allocate(&ascending, &descending, array, array_length);

    print(ascending, descending, array, array_length);

    return 0;

}

void allocate(int ***ascending, int ***descending, int array[], int array_length) {

    *ascending = (int **)malloc(array_length * sizeof(int *));
    *descending = (int **)malloc(array_length * sizeof(int *));

    int i = 0;//, first_index = 0;

    for (i = 0; i < array_length; i++) {

        (*ascending)[i] = &(array[i]);
        (*descending)[i] = &(array[i]);

    }

}

void print(int **ascending, int **descending, int array[], int array_length) {

    int i;

    printf("\nAscending\tOriginal\tDescending\n\n");

    for (i = 0; i < array_length; i++) {

        printf("%d\t\t", *(ascending[i]));
        printf("%d\t\t", array[i]);
        printf("%d\t\t", *(descending[i]));

        printf("\n");

    }

    printf("\n");

}

关于c - 如何在函数中为指针数组分配内存和赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40857850/

相关文章:

C - 检查结构体数组的所有值是否返回相同的值

javascript - 在 Javascript 中将数组设置为 Map 值

c - 为什么这个 C 程序不能正常运行?

c++ - 为什么链表使用指针而不是在节点内存储节点

c - 如何使用标准库在 GNU C 中生成 A 到 B 之间的伪随机数(A,B 是整数)

c++ - 从 cvShowImage 调整 View 大小

javascript - 比较两个数组中的多个对象

从 void** 转换为 int

c - 转换为不同签名的函数指针

c - 有信号和无信号的事件状态