在下面的這段代碼中,我試圖創建一個可以從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;
}
uj5u.com熱心網友回復:
中只有一個簡單的錯字*arrayOfInts[i - 1] = i;。后綴運算子(例如[]bind)比前綴運算子(例如*. 因此你應該寫:
(*arrayOfInts)[i - 1] = i;
另請注意,您應該檢查記憶體重新分配失敗,并且您可以初始化*arrayOfInts為NULLasrealloc(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;
}
uj5u.com熱心網友回復:
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");
}
}
uj5u.com熱心網友回復:
對于初學者來說,在 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。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/373369.html
下一篇:對包含結構的表使用realloc
