gpt4 book ai didi

c - Malloc'ing 数组然后释放它们?

转载 作者:太空狗 更新时间:2023-10-29 15:06:59 25 4
gpt4 key购买 nike

我目前正在处理 c 我在指针使用和语法方面遇到了一些小问题。

下面,我(尝试)创建一个指向整数数组的指针数组,然后将每个指针指向一个通过 malloc() 创建的数组。

在创建数组后,我然后循环遍历每个单元格,并分配一个值。

现在,所有这一切似乎都有效,但是当使用 free() 收回内存时,程序崩溃了。

我注意到,如果我 malloc() 数组内存,然后立即对它们调用 free(),程序将毫无问题地执行。但是,当我 malloc()、分配值然后调用 free() 时,将发生崩溃。 (段错误)。

下面是有效的代码,malloc() 然后立即 free()ing

int (*ptrArr[5])[5];

for(int i=0; i<5; i++)
ptrArr[i] = malloc(sizeof(int) * 5);

for(int i=0; i<5; i++)
printf("ptrArr[%d][%x]->[%x]\n", i, &ptrArr[i], &*ptrArr[i]);
printf("\n");

for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
printf("[%x](%2d) | ", &*ptrArr[i][j], *ptrArr[i][j]);
}
printf("\n");
}

for(int i=4; i>=0; i--)
free(ptrArr[i]);

上面的代码按我的预期执行,但是当我为单元格赋值然后尝试调用 free 时,会生成段错误:

int (*ptrArr[5])[5];

for(int i=0; i<5; i++)
ptrArr[i] = malloc(sizeof(int) * 5);

for(int i=0; i<5; i++)
printf("ptrArr[%d][%x]->[%x]\n", i, &ptrArr[i], &*ptrArr[i]);
printf("\n");

for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
printf("[%x](%2d) | ", &*ptrArr[i][j], *ptrArr[i][j]);
}
printf("\n");
}

int loop = 5;
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
*ptrArr[i][j] = (loop + (i*j));
++loop;
}
}

printf("\n");
for(int i=0; i<5; i++){
for(int j=0; j<5; j++){
printf("[%x](%2d) | ", &*ptrArr[i][j], *ptrArr[i][j]);
}
printf("\n");
}

for(int i=4; i>=0; i--)
{
printf("Freeing ptrArr[%x]\n", i);
free(ptrArr[i]);
}

我想我要么误解了

int (*ptrArr[5])[5];

声明,我想要的是一个由 5 个指针组成的数组,每个指针都指向一个整数数组,或者我没有正确地为单元格赋值,而是破坏了导致 free() 失败的内存。

如有任何帮助,我将不胜感激,我希望问题清晰简洁。

谢谢。

最佳答案

我处理这类问题的方法是打印出各种嫌疑人的sizeof,像这样

int (*test[5])[5];

printf( "%zu ", sizeof(test) );
printf( "%zu ", sizeof(test[0]) );
printf( "%zu\n", sizeof(test[0][0]) );

结果是 40 8 20。 (请注意,在我的机器上,int 是 4 个字节,指针是 8 个字节。)
所以这告诉我 test 是一个包含 5 个指针的数组。从逻辑上讲,test[0] 是一个指针。但有趣的是,test[0][0] 是一个包含 5 个整数的数组。

如果我添加下面这行代码

printf( "%zu\n", sizeof(test[0][0][0]) );

输出为 4,即 test[0][0][0] 是单个 int。由此我们得出结论,声明 int (*test[5])[5] 正在声明一个三维数组,这不是您想要的。


所以让我们尝试一个更简单的声明,像这样

int (*test)[5];

printf( "%zu ", sizeof(test) );
printf( "%zu ", sizeof(test[0]) );
printf( "%zu\n", sizeof(test[0][0]) );

输出为8 20 4,也就是说test是一个单指针,test[0]是一个数组5 个整数,test[0][0] 是单个 int。我们得出结论,int (*test)[5] 声明了一个二维数组。


下一个问题是我们如何为数组分配内存。如果我们这样做

test = malloc( 5 * sizeof(int) );

然后我们有一个 1 行 5 列的数组,基本上是一个一维数组。

要得到一个N行的二维数组,我们需要

test = malloc( N * 5 * sizeof(int) );

然后我们可以像这样填充、打印和释放数组

int N = 5;
for ( int row = 0; row < N; row++ )
for ( int col = 0; col < 5; col++ )
test[row][col] = (row+5)*10 + col;

for ( int row = 0; row < N; row++ )
{
for ( int col = 0; col < 5; col++ )
printf( "%2d ", test[row][col] );
printf( "\n" );
}

free( test );

关于c - Malloc'ing 数组然后释放它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33659971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com