我是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
函数中使用了指针?
在下一行:
*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
。