在这种情况下如何使用 free() 函数?使用 malloc() 和 realloc()
How use free() function in this case? using malloc() and realloc()
你能告诉我在这段代码中我必须将数组“arr”的 free() 函数放在哪里吗?我试图将 free(arr) 放在最后一个 printf() 之前,但这样我的输出是错误的。我也在尝试检查分配的内存是否空闲。
int *boh(int *arr,int n);
int main() {
int a,i,n;
int *arr;
int *b;
int size = 6;
arr = (int*) malloc(size* sizeof(int));
for (i= 0; i<6; i++){
printf("Give me a number: \n");
scanf("%d",&a);
if(i != 5){
arr[i] = a;
}
else{
n = a;
}
}
b = boh(arr,n);
for(i=0; i<5+n; i++){
printf("%d\n",b[i]);
}
return 0;
}
int *boh(int *arr,int n){
int *a;
int i;
int b;
b = arr[4];
a = (int*) realloc(arr,n*sizeof(int)+sizeof(arr));
for(i=5; i<5+n; i++){
b += b;
arr[i] = b;
}
return arr;
}
我认为你的程序有一些缺陷。
这是一个没有内存泄漏的版本:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
int *boh(int *arr, int n) {
int *a;
int i;
int b;
b = arr[SIZE - 2];
a = (int *) realloc(arr, (n + SIZE) * sizeof(int));
for (i = SIZE - 1; i < (n + SIZE); i++) {
b += b;
a[i] = b;
}
return a;
}
int main() {
int a, i, n;
int *arr;
int *b;
arr = (int *) calloc(SIZE, sizeof(int));
for (i = 0; i < SIZE; i++) {
printf("Give me a number: \n");
scanf("%d", &a);
if (i != SIZE - 1) {
arr[i] = a;
} else {
n = a;
}
}
b = boh(arr, n);
for (i = 0; i < (n + SIZE); i++) {
printf("%d\n", b[i]);
}
free(b);
return 0;
}
您必须将 free
放入您使用 malloc
或类似函数创建的指针。
我检测到的一个问题是您在使用 realloc
时没有传递数组的实际大小。
使用sizeof(arr)
是不行的,你必须把它作为参数传递给函数。
Can you tell me where i have to put the free() function for the array "arr" in this code?
没有 适合您的主程序到 free()
指针 arr
的位置,因为函数 boh()
重新分配了它指向的块.此后,您有责任释放的指针是 return 由 realloc()
编辑的指针,而不是原始指针。原始指针必须被视为无效。这两者在实践中可能具有相同的值,但通常情况下它们并不相同。
因此,您的函数 boh
也不得在重新分配后尝试写入 arr
的原始值,就像它在计算 arr[i] = b
时所做的那样。
需要更正这些:
检查每个 malloc()
和 realloc()
(以及 calloc()
)调用的 return 值。这些函数 return 失败时的空指针,在这种情况下您需要以某种方式适应它,例如干净地终止程序。
在验证 realloc()
的 return 值不为 null 后,您的函数 boh
必须使用该值而不是 [=12 的原始值=].一种相当简单的方法是在 for
循环之前将其分配给 arr
:
arr = a;
在这种情况下,这也会导致函数 return 新指针值,这是您有责任释放的值。
在主程序中,使用完后释放b
(即return
之前)。
I'm trying also to check if the memory allocated is free.
C 不提供任何方法来测试指针的分配状态。程序员需要自己跟踪。但是,您可以考虑 运行 您的程序受外部 leak-checking 程序的控制,例如 Valgrind。
你能告诉我在这段代码中我必须将数组“arr”的 free() 函数放在哪里吗?我试图将 free(arr) 放在最后一个 printf() 之前,但这样我的输出是错误的。我也在尝试检查分配的内存是否空闲。
int *boh(int *arr,int n);
int main() {
int a,i,n;
int *arr;
int *b;
int size = 6;
arr = (int*) malloc(size* sizeof(int));
for (i= 0; i<6; i++){
printf("Give me a number: \n");
scanf("%d",&a);
if(i != 5){
arr[i] = a;
}
else{
n = a;
}
}
b = boh(arr,n);
for(i=0; i<5+n; i++){
printf("%d\n",b[i]);
}
return 0;
}
int *boh(int *arr,int n){
int *a;
int i;
int b;
b = arr[4];
a = (int*) realloc(arr,n*sizeof(int)+sizeof(arr));
for(i=5; i<5+n; i++){
b += b;
arr[i] = b;
}
return arr;
}
我认为你的程序有一些缺陷。
这是一个没有内存泄漏的版本:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
int *boh(int *arr, int n) {
int *a;
int i;
int b;
b = arr[SIZE - 2];
a = (int *) realloc(arr, (n + SIZE) * sizeof(int));
for (i = SIZE - 1; i < (n + SIZE); i++) {
b += b;
a[i] = b;
}
return a;
}
int main() {
int a, i, n;
int *arr;
int *b;
arr = (int *) calloc(SIZE, sizeof(int));
for (i = 0; i < SIZE; i++) {
printf("Give me a number: \n");
scanf("%d", &a);
if (i != SIZE - 1) {
arr[i] = a;
} else {
n = a;
}
}
b = boh(arr, n);
for (i = 0; i < (n + SIZE); i++) {
printf("%d\n", b[i]);
}
free(b);
return 0;
}
您必须将 free
放入您使用 malloc
或类似函数创建的指针。
我检测到的一个问题是您在使用 realloc
时没有传递数组的实际大小。
使用sizeof(arr)
是不行的,你必须把它作为参数传递给函数。
Can you tell me where i have to put the free() function for the array "arr" in this code?
没有 适合您的主程序到 free()
指针 arr
的位置,因为函数 boh()
重新分配了它指向的块.此后,您有责任释放的指针是 return 由 realloc()
编辑的指针,而不是原始指针。原始指针必须被视为无效。这两者在实践中可能具有相同的值,但通常情况下它们并不相同。
因此,您的函数 boh
也不得在重新分配后尝试写入 arr
的原始值,就像它在计算 arr[i] = b
时所做的那样。
需要更正这些:
检查每个
malloc()
和realloc()
(以及calloc()
)调用的 return 值。这些函数 return 失败时的空指针,在这种情况下您需要以某种方式适应它,例如干净地终止程序。在验证
realloc()
的 return 值不为 null 后,您的函数boh
必须使用该值而不是 [=12 的原始值=].一种相当简单的方法是在for
循环之前将其分配给arr
:arr = a;
在这种情况下,这也会导致函数 return 新指针值,这是您有责任释放的值。
在主程序中,使用完后释放
b
(即return
之前)。
I'm trying also to check if the memory allocated is free.
C 不提供任何方法来测试指针的分配状态。程序员需要自己跟踪。但是,您可以考虑 运行 您的程序受外部 leak-checking 程序的控制,例如 Valgrind。