修改指向整数数组的双指针
modifying double pointer to an integer array
我有一个指向 int *array
的指针,我分配了它,然后将它传递给函数以填充数组的元素。
void function(int **arr);
int main()
{
int *array;
array=calloc(4, sizeof(int));
function(&array);
return0;
}
void function(int **arr)
{
int *tmp;
tmp=calloc(4, sizeof(int));
tmp[0]=1;
tmp[1]=2;
tmp[2]=3;
tmp[3]=4;
}
我想将 tmp
分配给 arr
。我该怎么做?
首先,您不需要在 main
中 calloc
array
。它是一个指针,您需要做的就是将 tmp
分配给它。方法如下:
void function(int **arr);
int main()
{
int *array;
size_t i;
function(&array);
// do stuff with array
for (i = 0; i < 4; i++)
{
printf("%d\n", array[i]);
}
// then clean up
free(array);
return 0;
}
void function(int **arr)
{
int *tmp;
tmp=calloc(4, sizeof(int));
tmp[0]=1;
tmp[1]=2;
tmp[2]=3;
tmp[3]=4;
*arr = tmp;
}
你不应该那样做,因为在这种情况下会出现内存泄漏,因为你已经为指针数组分配了内存,并且赋值将覆盖指针中存储的值。把函数写得更简单
void function(int **arr)
{
int *tmp = *arr;
tmp[0]=1;
tmp[1]=2;
tmp[2]=3;
tmp[3]=4;
}
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
void init( int **a, size_t n, int value )
{
int *tmp = *a;
size_t i = 0;
for ( ; i < n; i++ ) tmp[i] = value++;
}
void display ( int *a, size_t n )
{
size_t i = 0;
for ( ; i < n; i++ ) printf( "%d ", a[i] );
printf( "\n" );
}
int main(void)
{
int *a;
size_t n = 4;
a = calloc( n, sizeof( int ) );
init( &a, n, 0 );
display( a, n );
init( &a, n, 10 );
display( a, n );
free( a );
return 0;
}
程序输出为
0 1 2 3
10 11 12 13
如果您需要在函数中重新分配原始数组,那么可以通过以下方式完成
#include <stdio.h>
#include <stdlib.h>
void init( int **a, size_t n, int value )
{
int *tmp = *a;
size_t i = 0;
for ( ; i < n; i++ ) tmp[i] = value++;
}
void display ( int *a, size_t n )
{
size_t i = 0;
for ( ; i < n; i++ ) printf( "%d ", a[i] );
printf( "\n" );
}
void alloc_new( int **a, size_t n )
{
int *tmp = malloc( n * sizeof( int ) );
if ( tmp )
{
free( *a );
*a = tmp;
}
}
int main(void)
{
int *a;
size_t n = 4;
a = calloc( n, sizeof( int ) );
init( &a, n, 0 );
display( a, n );
alloc_new( &a, n );
init( &a, n, 10 );
display( a, n );
free( a );
return 0;
}
也许你应该声明 function
在 main 中使用它之前。如果编译器认为 function
需要一个 int
参数,而它应该是一个 int**
参数,那么它可能会产生错误的代码...
你刚刚添加了一个声明,还是我错过了?如果是这样,抱歉!
我有一个指向 int *array
的指针,我分配了它,然后将它传递给函数以填充数组的元素。
void function(int **arr);
int main()
{
int *array;
array=calloc(4, sizeof(int));
function(&array);
return0;
}
void function(int **arr)
{
int *tmp;
tmp=calloc(4, sizeof(int));
tmp[0]=1;
tmp[1]=2;
tmp[2]=3;
tmp[3]=4;
}
我想将 tmp
分配给 arr
。我该怎么做?
首先,您不需要在 main
中 calloc
array
。它是一个指针,您需要做的就是将 tmp
分配给它。方法如下:
void function(int **arr);
int main()
{
int *array;
size_t i;
function(&array);
// do stuff with array
for (i = 0; i < 4; i++)
{
printf("%d\n", array[i]);
}
// then clean up
free(array);
return 0;
}
void function(int **arr)
{
int *tmp;
tmp=calloc(4, sizeof(int));
tmp[0]=1;
tmp[1]=2;
tmp[2]=3;
tmp[3]=4;
*arr = tmp;
}
你不应该那样做,因为在这种情况下会出现内存泄漏,因为你已经为指针数组分配了内存,并且赋值将覆盖指针中存储的值。把函数写得更简单
void function(int **arr)
{
int *tmp = *arr;
tmp[0]=1;
tmp[1]=2;
tmp[2]=3;
tmp[3]=4;
}
这是一个演示程序
#include <stdio.h>
#include <stdlib.h>
void init( int **a, size_t n, int value )
{
int *tmp = *a;
size_t i = 0;
for ( ; i < n; i++ ) tmp[i] = value++;
}
void display ( int *a, size_t n )
{
size_t i = 0;
for ( ; i < n; i++ ) printf( "%d ", a[i] );
printf( "\n" );
}
int main(void)
{
int *a;
size_t n = 4;
a = calloc( n, sizeof( int ) );
init( &a, n, 0 );
display( a, n );
init( &a, n, 10 );
display( a, n );
free( a );
return 0;
}
程序输出为
0 1 2 3
10 11 12 13
如果您需要在函数中重新分配原始数组,那么可以通过以下方式完成
#include <stdio.h>
#include <stdlib.h>
void init( int **a, size_t n, int value )
{
int *tmp = *a;
size_t i = 0;
for ( ; i < n; i++ ) tmp[i] = value++;
}
void display ( int *a, size_t n )
{
size_t i = 0;
for ( ; i < n; i++ ) printf( "%d ", a[i] );
printf( "\n" );
}
void alloc_new( int **a, size_t n )
{
int *tmp = malloc( n * sizeof( int ) );
if ( tmp )
{
free( *a );
*a = tmp;
}
}
int main(void)
{
int *a;
size_t n = 4;
a = calloc( n, sizeof( int ) );
init( &a, n, 0 );
display( a, n );
alloc_new( &a, n );
init( &a, n, 10 );
display( a, n );
free( a );
return 0;
}
也许你应该声明 function
在 main 中使用它之前。如果编译器认为 function
需要一个 int
参数,而它应该是一个 int**
参数,那么它可能会产生错误的代码...
你刚刚添加了一个声明,还是我错过了?如果是这样,抱歉!