通过终端在 C 输入中动态分配的 int 数组
Dynamically allocated int Array in C input via terminal
我是 C 的新手,我试图编写一个动态 int 数组,让用户通过终端输入数字,直到用户输入 -1。因此,用户可以键入任意数量的 int,并且每次输入另一个有效 int 时都会重新分配数据。
有时它按预期工作其他时候我得到:free(): tcache 2 中检测到双重释放
中止(核心转储) 错误。
我在每次输入后打印值,一切看起来都很好,直到输入 -1。而且这个bug每隔一段时间才会出现。
这是我的代码:
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;
}
函数 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;
}
我是 C 的新手,我试图编写一个动态 int 数组,让用户通过终端输入数字,直到用户输入 -1。因此,用户可以键入任意数量的 int,并且每次输入另一个有效 int 时都会重新分配数据。
有时它按预期工作其他时候我得到:free(): tcache 2 中检测到双重释放 中止(核心转储) 错误。 我在每次输入后打印值,一切看起来都很好,直到输入 -1。而且这个bug每隔一段时间才会出现。
这是我的代码:
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;
}
函数 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;
}