获取指向C中2D数组的列的指针

问题描述 投票:0回答:1

我是C编程的新手,尤其是指针。在我编写的程序中,我试图编写一个函数,该函数返回指向数组指定列的指针。请参阅下面的代码以获得更好的理解(或混淆:)):

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

// function for getting pointer to specidifed column index
// 'ind' is index of requested column, 'ncol' is number of items in column
int* get_col(const int* arr, unsigned int ind, unsigned int ncol);

int main() {
    unsigned int n;

    printf("Input matrix size : ");
    scanf("%i", &n);

    int arr[n][n];

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++)
            arr[i][j] = i * n + j;
    }

    for (int i = 0; i < n; i++) {
        printf("values in column %d: \n", i);
        int *col = get_col((int*)arr, i, n);
        for (int j = 0; j < n; j++) {
            printf("%d ", *col);
            col = col + 1;
        }
        printf("\n");
    }

    return 0;
}

int* get_col(const int* arr, unsigned int ind, unsigned int ncol) {
    int *result = malloc(sizeof(int) * ncol);

    for (int i = 0; i < ncol; i++)
        *result = *(arr + i*ncol + ind);

    return result;
}

如您所见get_col函数将指向数组,列索引和列大小(列中元素的n,即行数)的指针作为参数,并尝试返回指向包含所请求索引中列值的一维数组的指针。问题是结果不正确。如果n=3结果如下所示:

Input matrix size : 3
values in column 0: 
6 0 0 // supposed to be 0 3 6
values in column 1: 
7 0 0 // supposed to be 1 4 7
values in column 2: 
8 0 0 // supposed to be 2 5 8

我认为问题在于我对指针的理解,而不是对实现的算法的理解。实际上,起初我没有在get_col函数中使用指针,如下所示:

int result[ncol];

// ... do my work here to populate array

return &result;

然后编译器抱怨warning: function returns address of local variable [-Wreturn-local-addr],我在数组result中将get_col从数组转换为指针,如上。这段代码有什么问题?我是否按原样在get_col函数中使用了指针?

c arrays pointers multidimensional-array
1个回答
1
投票

在下一行:

*result = *(arr + i*ncol + ind);

您一直在写入same内存地址。

将其更改为以下两个选项之一:

*(result + i) = *(arr + i*ncol + ind);
result[i] = *(arr + i*ncol + ind);

关于使用时的第二个问题:

int result[ncol];

// ... do my work here to populate array

return &result;

您应该理解,在这种情况下,result变量(静态内存分配)存储在堆栈中。因此,函数返回后,变量值不再存在于内存中。这就是为什么需要动态内存分配的原因。在动态内存分配中,该值会保留在内存中,直到you自己调用free

© www.soinside.com 2019 - 2024. All rights reserved.