Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:在分离函数中使用realloc()不会';不改变数组大小_C - Fatal编程技术网

C:在分离函数中使用realloc()不会';不改变数组大小

C:在分离函数中使用realloc()不会';不改变数组大小,c,C,我觉得这不应该是一个很难解决的问题,我已经尝试了我在类似问题上所发现的一切,但都无济于事,所以我想我应该试着问问自己。我的代码(简化)如下: #include <stdio.h> #include <stdlib.h> void setArraySize(int** arr) { int arrSize; printf("\nEnter array size: "); scanf("%d", &arrSize); int* tmp

我觉得这不应该是一个很难解决的问题,我已经尝试了我在类似问题上所发现的一切,但都无济于事,所以我想我应该试着问问自己。我的代码(简化)如下:

#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;
}
#包括
#包括
void setArraySize(整数**arr){
内角大小;
printf(“\n输入数组大小:”);
scanf(“%d”、&arrSize);
int*tmp=realloc(*arr,arrSize);
if(tmp==NULL){
printf(“错误”);
返回;
}
*arr=tmp;
}
void auswahl(){
int*arr=NULL;
设置阵列化(&arr);
免费(arr);
}
int main(){
auswahl();
返回0;
}
调试时,我注意到我的数组只包含整数-84215041。我正在使用Microsoft Visual Studio 2019社区。此外,即使在尝试最基本和最安全的函数时,我也会得到相同的结果。那么,问题是否与视觉工作室有关

#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;
}
#包括
#包括
无效增加(整数**数据)
{
int*tmp=realloc(*数据,20);
if(tmp==NULL){
printf(“错误”);
返回;
}
*数据=tmp;
}
int main(){
int*arr=NULL;
增加&arr;
printf(“%d”,sizeof(arr));
返回0;
}

提前感谢您的帮助

我稍微更改了您的第二个代码(添加了printf),它将帮助您了解正在发生的事情

#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;
}
所以基本上,
arr
的大小不会改变,因为它不是数组,它是指向int的指针,这里的大小是8,因为它是64位的机器,64位的内存地址需要存储8个字节,这就是
sizeof()
返回给定类型的字节大小(
int*arr
指向int的指针)

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


希望这能对您有所帮助。

我的数组只包含整数-84215051-它应该包含什么?如果使用
calloc
它将包含
0
。代码中的所有内容都按预期工作。
realloc
不会将任何内容放入数组中。它只是为数组保留内存。如果您需要数组中的某些内容,您需要在数组中放入一些内容。在“c”中,绝对无法获得动态分配的数组大小。因此,不要尝试。
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|