C-如何分配内存和分配一个指针数组的函数值



我在弄清楚如何为函数中的一系列指针分配内存时遇到了麻烦。在同一功能中,我试图用另一个数组的值初始化数组。我已经尝试了一段时间了,我无法弄清楚我在哪里做和不需要。

#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("nAscendingtOriginaltDescendingnn");
    for (i = 0; i < array_length; i++) {
        printf("%dtt", ascending[i]);
        printf("%dtt", array[i]);
        printf("%dtt", descending[i]);
        printf("n");
    }
    printf("n");
}

首先,不能初始化可变大小数组。您应该将宏用于array_length

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

  print(ascending, descending, array, array_length);

另外,在这种情况下, ascending[i]descending[i]是类型int *,您需要更多的删除才能获得int

也就是说,

void allocate();
void print();

bad 正向声明。您应该使用声明和定义的函数的确切签名。


示例工作版本看起来像

//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("nAscendingtOriginaltDescendingnn");
    for (i = 0; i < array_length; i++) {
        printf("%dtt", *(ascending[i]));
        printf("%dtt", array[i]);
        printf("%dtt", *(descending[i]));
        printf("n");
    }
    printf("n");
}

相关内容

  • 没有找到相关文章

最新更新