Arrays 通过终端在C输入中动态分配int数组
我是C新手,我试图编写一个动态int数组,让用户通过终端键入数字,直到用户键入-1为止。因此,用户可以键入任意数量的int,并且每次输入另一个有效的int时都会重新分配数据 有时它会像预期的那样工作,其他时候我得到:free():在TCache2中检测到双重空闲 中止(堆芯转储)错误。 每次输入后我都会打印这些值,直到输入-1为止,一切都很好。这个错误只会每隔一段时间出现一次 这是我的密码:Arrays 通过终端在C输入中动态分配int数组,arrays,c,pointers,dynamic,Arrays,C,Pointers,Dynamic,我是C新手,我试图编写一个动态int数组,让用户通过终端键入数字,直到用户键入-1为止。因此,用户可以键入任意数量的int,并且每次输入另一个有效的int时都会重新分配数据 有时它会像预期的那样工作,其他时候我得到:free():在TCache2中检测到双重空闲 中止(堆芯转储)错误。 每次输入后我都会打印这些值,直到输入-1为止,一切都很好。这个错误只会每隔一段时间出现一次 这是我的密码: void output(int *ptr, int len){ printf("\n&
void output(int *ptr, int len){
printf("\n");
for(int i=0; i<len; i++){
printf("%d %p \n", ptr[i], ptr+i);
}
printf("\n");
}
int input(int *ptr, int *size){
int x;
printf("Insert your numbers:\n");
while(1){
scanf("%d", &x);
if(x == -1) break;
size[0]++;
// printf("Size: %d\n", size[0]);
ptr = realloc(ptr, size[0] * sizeof(int));
if(ptr == NULL) return -1;
int indexToStore = size[0]-1;
// printf("Index: %d\n", indexToStore);
ptr[indexToStore] = x;
output(ptr, size[0]);
}
return 0;
}
int main()
{
int size = 0;
int *array = (int*)malloc(sizeof(int));
if(array == NULL) return -1;
input(array, &size);
output(array, size);
input(array, &size);
output(array, size);
free(array); array = NULL;
return 0;
}
void输出(int*ptr,int len){
printf(“\n”);
对于(int i=0;i函数input
的参数ptr
是传递内容的副本,修改内容不会影响调用方传递的内容
因此,从第一次调用input()
到第二次调用input()
时,通过realloc()
对缓冲区进行的更改不会被保存,这将导致故障
您应该传递一个指针,指向应该修改的内容,以使函数修改调用方的本地内容
#include <stdio.h>
#include <stdlib.h>
void output(int *ptr, int len){
printf("\n");
for(int i=0; i<len; i++){
printf("%d %p \n", ptr[i], ptr+i);
}
printf("\n");
}
int input(int **ptr, int *size){
int x;
printf("Insert your numbers:\n");
while(1){
scanf("%d", &x);
if(x == -1) break;
size[0]++;
// printf("Size: %d\n", size[0]);
*ptr = realloc(*ptr, size[0] * sizeof(int));
if(*ptr == NULL) return -1;
int indexToStore = size[0]-1;
// printf("Index: %d\n", indexToStore);
(*ptr)[indexToStore] = x;
output(*ptr, size[0]);
}
return 0;
}
int main()
{
int size = 0;
int *array = (int*)malloc(sizeof(int));
if(array == NULL) return -1;
input(&array, &size);
output(array, size);
input(&array, &size);
output(array, size);
free(array); array = NULL;
return 0;
}
#包括
#包括
无效输出(int*ptr,int len){
printf(“\n”);
对于(int i=0;i在第一次调用input()
时调用语句int indextore=size[0]-1;
时,size
中的值为0,因此size[0]-1
变为0xffffff(-1)所以indextore
变为-1。结果是语句中未定义的行为:ptr[indextore]=x;
此外,函数:output()
在每次调用input()
时被调用两次,这可能不是每次调用函数:input()
时所希望的,会创建另一个内存泄漏。这是因为main()
中的指针数组[]
从未更新,