如何正确访问这个重新分配的数组?
How to properly access this realloc-ed array?
在下面的代码中,我试图创建一个可以从 main()
函数访问的整数数组,但是,Address-sanitizer 给了我堆栈缓冲区溢出错误,我无法弄清楚我做错了什么。我错过了什么?
#include <stdlib.h>
void reallocFail(int **arrayOfInts) {
*arrayOfInts = (int *)malloc(sizeof(int));
for (int i = 1; i <= 10; i++) {
*arrayOfInts = (int *)realloc(*arrayOfInts, (i) * sizeof(int));
*arrayOfInts[i - 1] = i;
}
}
int main(void) {
int *arrayOfInts;
reallocFail(&arrayOfInts);
return 0;
}
对于初学者来说,for 循环之前的内存分配
*arrayOfInts = (int*)malloc(sizeof(int));
是多余的。你可以只写
*arrayOfInts = NULL;
另外需要检查内存分配是否成功
还有这条记录
*arrayOfInts[i-1] = i;
相当于
*( arrayOfInts[i-1] ) = i;
但你需要
( *arrayOfInts )[i-1] = i;
函数可以如下所示
size_t reallocFail( int **arrayOfInts, size_t n )
{
*arrayOfInts = NULL;
size_t i = 0;
if ( n != 0 )
{
int *tmp = NULL;
do
{
tmp = realloc( *arrayOfInts, ( i + 1 ) * sizeof( int ) );
if ( tmp != NULL )
{
tmp[i] = i + 1;
*arrayOfInts = tmp;
}
} while ( tmp != NULL && ++i != n );
}
return i;
}
并且函数可以被调用,例如
int *arrayOfInts = NULL;
size_t n = reallocFail( &arrayOfInts, 10 );
for ( size_t i = 0; i != n; i++ )
{
printf( "%d ", arrayOfInts[i] );
}
putchar( '\n' );
free( arrayOfInts );
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
size_t reallocFail( int **arrayOfInts, size_t n )
{
*arrayOfInts = NULL;
size_t i = 0;
if ( n != 0 )
{
int *tmp = NULL;
do
{
tmp = realloc( *arrayOfInts, ( i + 1 ) * sizeof( int ) );
if ( tmp != NULL )
{
tmp[i] = i + 1;
*arrayOfInts = tmp;
}
} while ( tmp != NULL && ++i != n );
}
return i;
}
int main( void )
{
int *arrayOfInts = NULL;
size_t n = reallocFail( &arrayOfInts, 10 );
for ( size_t i = 0; i != n; i++ )
{
printf( "%d ", arrayOfInts[i] );
}
putchar( '\n' );
free( arrayOfInts );
return 0;
}
程序输出为
1 2 3 4 5 6 7 8 9 10
当然在函数内循环重新分配内存没有太大意义。该函数只是演示如何管理函数 realloc
.
*arrayOfInts[i - 1] = i;
中只是一个简单的拼写错误。 []
等后缀运算符比 *
等前缀运算符绑定更强。因此你应该写:
(*arrayOfInts)[i - 1] = i;
另请注意,您应该检查内存重新分配失败,您可以将 *arrayOfInts
初始化为 NULL
,因为 realloc(NULL, size)
等同于 malloc(size)
。
这是修改后的版本:
#include <string.h>
#include <stdlib.h>
int reallocFail(int **pp, int n) {
int i;
*pp = NULL;
for (i = 0; i < n; i++) {
int *p = realloc(*pp, (i + 1) * sizeof(*p));
if (p == NULL)
break;
p[i] = i + 1;
*pp = p;
}
return i;
}
int main(void) {
int *arrayOfInts = NULL;
int n = reallocFail(&arrayOfInts, 10);
for (int i = 0; i < n; i++) {
printf("%d%c", arrayOfInts[i], " \n"[i == n-1]);
}
free(arrayOfInt);
return 0;
}
void reallocFail(int **arrayOfInts)
{
for (int i = 1; i <= 10; i++)
{
*arrayOfInts = realloc(*arrayOfInts, i * sizeof(**arrayOfInts));
arrayOfInts[0][i - 1] = i;
}
}
int main(void) {
int *arrayOfInts = NULL;
reallocFail(&arrayOfInts);
return 0;
}
但是这段代码可以减少到一个 realloc
(我知道你测试 realloc 是否有效)。
IT 不检查 realloc
是成功还是失败:
void reallocFail(int **arrayOfInts)
{
int *tmp;
for (int i = 1; i <= 10; i++)
{
tmp = realloc(*arrayOfInts, i * sizeof(**arrayOfInts));
if(tmp)
{
*arrayOfInts = tmp;
arrayOfInts[0][i - 1] = i;
}
else
printf("Alloction error\n");
}
}
在下面的代码中,我试图创建一个可以从 main()
函数访问的整数数组,但是,Address-sanitizer 给了我堆栈缓冲区溢出错误,我无法弄清楚我做错了什么。我错过了什么?
#include <stdlib.h>
void reallocFail(int **arrayOfInts) {
*arrayOfInts = (int *)malloc(sizeof(int));
for (int i = 1; i <= 10; i++) {
*arrayOfInts = (int *)realloc(*arrayOfInts, (i) * sizeof(int));
*arrayOfInts[i - 1] = i;
}
}
int main(void) {
int *arrayOfInts;
reallocFail(&arrayOfInts);
return 0;
}
对于初学者来说,for 循环之前的内存分配
*arrayOfInts = (int*)malloc(sizeof(int));
是多余的。你可以只写
*arrayOfInts = NULL;
另外需要检查内存分配是否成功
还有这条记录
*arrayOfInts[i-1] = i;
相当于
*( arrayOfInts[i-1] ) = i;
但你需要
( *arrayOfInts )[i-1] = i;
函数可以如下所示
size_t reallocFail( int **arrayOfInts, size_t n )
{
*arrayOfInts = NULL;
size_t i = 0;
if ( n != 0 )
{
int *tmp = NULL;
do
{
tmp = realloc( *arrayOfInts, ( i + 1 ) * sizeof( int ) );
if ( tmp != NULL )
{
tmp[i] = i + 1;
*arrayOfInts = tmp;
}
} while ( tmp != NULL && ++i != n );
}
return i;
}
并且函数可以被调用,例如
int *arrayOfInts = NULL;
size_t n = reallocFail( &arrayOfInts, 10 );
for ( size_t i = 0; i != n; i++ )
{
printf( "%d ", arrayOfInts[i] );
}
putchar( '\n' );
free( arrayOfInts );
这是一个演示程序。
#include <stdio.h>
#include <stdlib.h>
size_t reallocFail( int **arrayOfInts, size_t n )
{
*arrayOfInts = NULL;
size_t i = 0;
if ( n != 0 )
{
int *tmp = NULL;
do
{
tmp = realloc( *arrayOfInts, ( i + 1 ) * sizeof( int ) );
if ( tmp != NULL )
{
tmp[i] = i + 1;
*arrayOfInts = tmp;
}
} while ( tmp != NULL && ++i != n );
}
return i;
}
int main( void )
{
int *arrayOfInts = NULL;
size_t n = reallocFail( &arrayOfInts, 10 );
for ( size_t i = 0; i != n; i++ )
{
printf( "%d ", arrayOfInts[i] );
}
putchar( '\n' );
free( arrayOfInts );
return 0;
}
程序输出为
1 2 3 4 5 6 7 8 9 10
当然在函数内循环重新分配内存没有太大意义。该函数只是演示如何管理函数 realloc
.
*arrayOfInts[i - 1] = i;
中只是一个简单的拼写错误。 []
等后缀运算符比 *
等前缀运算符绑定更强。因此你应该写:
(*arrayOfInts)[i - 1] = i;
另请注意,您应该检查内存重新分配失败,您可以将 *arrayOfInts
初始化为 NULL
,因为 realloc(NULL, size)
等同于 malloc(size)
。
这是修改后的版本:
#include <string.h>
#include <stdlib.h>
int reallocFail(int **pp, int n) {
int i;
*pp = NULL;
for (i = 0; i < n; i++) {
int *p = realloc(*pp, (i + 1) * sizeof(*p));
if (p == NULL)
break;
p[i] = i + 1;
*pp = p;
}
return i;
}
int main(void) {
int *arrayOfInts = NULL;
int n = reallocFail(&arrayOfInts, 10);
for (int i = 0; i < n; i++) {
printf("%d%c", arrayOfInts[i], " \n"[i == n-1]);
}
free(arrayOfInt);
return 0;
}
void reallocFail(int **arrayOfInts)
{
for (int i = 1; i <= 10; i++)
{
*arrayOfInts = realloc(*arrayOfInts, i * sizeof(**arrayOfInts));
arrayOfInts[0][i - 1] = i;
}
}
int main(void) {
int *arrayOfInts = NULL;
reallocFail(&arrayOfInts);
return 0;
}
但是这段代码可以减少到一个 realloc
(我知道你测试 realloc 是否有效)。
IT 不检查 realloc
是成功还是失败:
void reallocFail(int **arrayOfInts)
{
int *tmp;
for (int i = 1; i <= 10; i++)
{
tmp = realloc(*arrayOfInts, i * sizeof(**arrayOfInts));
if(tmp)
{
*arrayOfInts = tmp;
arrayOfInts[0][i - 1] = i;
}
else
printf("Alloction error\n");
}
}