gpt4 book ai didi

C:在单独的函数中使用 realloc() 不会改变数组大小

转载 作者:行者123 更新时间:2023-11-30 16:08:16 24 4
gpt4 key购买 nike

我觉得这不应该是一个如此困难的问题,而且我已经尝试了在类似问题上找到的所有方法都无济于事,所以我想我应该尝试问自己。我的代码(简化)如下:

#include <stdio.h>
#include <stdlib.h>

void setArraySize(int** arr) {
int arrSize;
printf("\nEnter array size: ");
scanf("%d", &arrSize);
int* tmp = realloc(*arr, arrSize);
if (tmp == NULL) {
printf("Error");
return;
}
*arr = tmp;
}

void auswahl() {
int* arr = NULL;
setArraySize(&arr);
free(arr);
}

int main() {
auswahl();
return 0;
}

调试时我注意到我的数组仅包含整数-842150451。我正在使用 Microsoft Visual Studios 2019 社区。此外,即使尝试最基本和最安全的功能,我也得到了相同的结果。那么问题是否与 Visual Studios 有关?

#include <stdio.h>
#include <stdlib.h>

void increase(int** data)
{
int* tmp = realloc(*data, 20);
if (tmp == NULL) {
printf("Error");
return;
}
*data = tmp;
}

int main() {
int* arr = NULL;
increase(&arr);
printf("%d", sizeof(arr));
return 0;
}

预先感谢您的帮助!

最佳答案

我稍微改变了你的第二个代码(添加了 printf's),它将帮助你理解发生了什么

#include <stdio.h>
#include <stdlib.h>

void increase(int** data)
{
printf ("in increase|*data|%p|\n", *data);
int* tmp = realloc(*data, 20);
printf ("in increase|*data after realloc|%p|\n", *data);
printf ("in increase|tmp after realloc|%p|\n", tmp);
if (tmp == NULL) {
printf("Error");
return;
}
*data = tmp;
printf ("in increase|*data after assign|%p|\n", *data);
}

int main() {
int* arr = NULL;
printf ("in main|arr|%p|\n", arr);
printf ("in main|arr size|%d|\n", sizeof(arr));
increase(&arr);
printf ("in main|arr after increase|%p|\n", arr);
printf ("in main|arr size after increase|%d|\n", sizeof(arr));
return 0;
}

这将输出:

in main|arr|(nil)|                                                                                                            
in main|arr size|8|
in increase|*data|(nil)|
in increase|*data after realloc|(nil)|
in increase|tmp after realloc|0x2441010|
in increase|*data after assign|0x2441010|
in main|arr after increase|0x2441010|
in main|arr size after increase|8|

所以基本上arr的大小不会改变,因为它不是一个数组,它是一个指向int的指针,这里的大小是8,因为它是一个64位机器,并且64位需要内存地址要存储 8 个字节,这就是 sizeof() 返回您给它的类型的大小(以字节为单位)( int* arr 指向 int 的指针)

对于其他值,您可以看到您已在堆中的地址 0x2441010 处有效分配了内存,因此您的 QUOTE"array"QUOTE (它不是数组)从该地址开始并具有足够的内存20(BYTES) 的空间如果您想要 20 个整数,您应该使用 realloc(..., 20* sizeof(int)) 因为这些分配函数使用字节作为单位。

希望这对您有所帮助。

关于C:在单独的函数中使用 realloc() 不会改变数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59417049/

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