我在 c 中使用 realloc() 做错了什么?
What am I doing wrong with realloc() in c?
请问,内存管理我做错了什么。我只想从 stdin 读取一些 int 数组然后打印它。从2个元素开始,按2分配到我满意的数量。
#include <stdio.h>
#include <stdlib.h>
void read (int * array, int * n, int * l) {
int * tmp;
printf("Enter values:\n");
for (*l = 0; *l < *n; (*l)++) {
if (*l == *n - 1) {
(*n) *= 2;
tmp = (int*) realloc (array, sizeof(int) * (*n));
if (tmp != NULL) {
array = tmp;
free(tmp);
}
else {
printf("Error!\n");
free(tmp);
}
if (scanf("%d", &array[*l]) != 1) break;
}
}
void print (int * array, int length) {
int i;
printf("Your values:\n");
for (i = 0; i < length; i++) printf("%d ", array[i]);
}
int main (void) {
int n = 2; /* number of array elements */
int length = 0;
int * array = (int *) malloc(sizeof(int) * n);
read(array, &n, &length);
print(array, length);
free(array);
return 0;
}
重新分配成功后删除空闲。 Realloc 会为你处理这些。此外,如果您遇到错误情况,您将双倍 free() 您的缓冲区。
关于:free(tmp);
此语句不应出现在发布的代码中。
它释放刚刚分配的内存
====
指针 'n' 最好指向调用者中已分配的数组,而不是某个固定数组
====
当传递一个指针时,被调用函数将改变该指针指向的位置,它必须(在当前情况下)作为 int **n
传递。这也意味着调用函数必须传递指针的地址,而不是指针的内容
====
变量(和参数)名称应指示 usage
或 content
(或更好,两者) 即使在当前上下文中,参数名称 'n' 和 'l' 也无意义
请问,内存管理我做错了什么。我只想从 stdin 读取一些 int 数组然后打印它。从2个元素开始,按2分配到我满意的数量。
#include <stdio.h>
#include <stdlib.h>
void read (int * array, int * n, int * l) {
int * tmp;
printf("Enter values:\n");
for (*l = 0; *l < *n; (*l)++) {
if (*l == *n - 1) {
(*n) *= 2;
tmp = (int*) realloc (array, sizeof(int) * (*n));
if (tmp != NULL) {
array = tmp;
free(tmp);
}
else {
printf("Error!\n");
free(tmp);
}
if (scanf("%d", &array[*l]) != 1) break;
}
}
void print (int * array, int length) {
int i;
printf("Your values:\n");
for (i = 0; i < length; i++) printf("%d ", array[i]);
}
int main (void) {
int n = 2; /* number of array elements */
int length = 0;
int * array = (int *) malloc(sizeof(int) * n);
read(array, &n, &length);
print(array, length);
free(array);
return 0;
}
重新分配成功后删除空闲。 Realloc 会为你处理这些。此外,如果您遇到错误情况,您将双倍 free() 您的缓冲区。
关于:free(tmp);
此语句不应出现在发布的代码中。
它释放刚刚分配的内存
==== 指针 'n' 最好指向调用者中已分配的数组,而不是某个固定数组
====
当传递一个指针时,被调用函数将改变该指针指向的位置,它必须(在当前情况下)作为 int **n
传递。这也意味着调用函数必须传递指针的地址,而不是指针的内容
====
变量(和参数)名称应指示 usage
或 content
(或更好,两者) 即使在当前上下文中,参数名称 'n' 和 'l' 也无意义