我有一个用malloc创建的数组。
int *array = (int *) malloc(10 * sizeof(int));
我想在函数中使用这个数组。我想在主函数中影响数组的值。就像一个指针
void func(int **array);
我该如何正确地执行此操作?
首先想到(工作(:
void func(int **arr){
arr[0][0] = 100;
arr[0][1] = 200;
}
int main(){
int *arr = (int*) malloc(10 * sizeof(int));
func(&arr);
printf("arr[0] = %dnarr[1] = %dn", arr[0], arr[1]);
return 0;
}
第二(无效(:
typedef int* intarr;
void func(intarr *arr){
*arr[0] = 100;
*arr[1] = 200;
}
int main(){
intarr arr = (int*) malloc(10 * sizeof(int));
func(&arr);
printf("arr[0] = %dnarr[1] = %dn", arr[0], arr[1]);
return 0;
}
我的第一个问题是,为什么我在第二种方法中会出现分割错误?
我的第二个问题是第一种方法有多准确?
我的第三个问题是你在用什么?
只有当函数需要能够重新分配调用方的变量时,才需要使用**arr
。请参阅使用函数更改指针所包含的地址,以获取需要这样做的示例。
如果只是使用和/或更新数组的内容,只需传递指针本身。
如果函数需要知道数组的大小,那么也需要显式传递。请参阅如何查找';sizeof';(指向数组的指针(?
void func(int *arr){
arr[0] = 100;
arr[1] = 200;
}
int main(){
int *arr = malloc(10 * sizeof(int));
func(arr);
printf("arr[0] = %dnarr[1] = %dn", arr[0], arr[1]);
return 0;
}
然后,有这样的:
#include <stdio.h>
#if 1
// Showing the equivalent to "int *arr", array notation aids consistency
void func( int arr[], int sz ) {
// Can test that array index does overrun size of array
arr[0] = 100;
arr[1] = 200;
}
#else
void func( int *arr, int sz ) {
*(arr + 0) = 100;
*(arr + 1) = 200;
}
#endif
int main() {
// EDIT - switch to calloc
// int *arr = malloc( 10 * sizeof *arr ); // better. simple. don't cast.
int *arr = calloc( 10, sizeof *arr ); // consistent initialisation
/* omitting test for failure */
func( arr, 10 ); // pass the size because function won't know.
printf("arr[0] = %dnarr[1] = %dn", arr[0], arr[1]);
// No one has mentioned "memory leaks".
// Amazing what qualifies as a "good" answer.
free( arr );
return 0;
}
人们也会阅读代码。考虑它们的易用性与正确编写代码同样重要。(Bug潜伏在"具有挑战性"的角落。想想一个错误。(
通过使用calloc()
,调用方可以确保未由函数设置的数组元素是一致的(即,不会像未初始化的变量那样从执行到执行发生变化。(如果存在错误,则一致的坏性能会使跟踪错误变得更加容易。一些测试中出现的错误,然后在其他测试中消失,将导致编码器加速老化。