我想问一下,我在内存管理上做错了什么。我只是想从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;
}
答案 0 :(得分:1)
关于:free(tmp);
此声明不应位于已发布代码中的任何位置。
释放刚刚分配的内存
==== 指针&#39; n&#39;最好是指向一个数组,在调用者中,分配而不是某些固定数组
====
当传递一个指针,其中被调用的函数将改变指针所指向的位置时,它必须作为int **n
传递(在当前场景中)。这也意味着调用函数必须传递指针的地址,而不是指针的内容
====
变量(和参数)名称应指明usage
或content
(或更好,两者)参数名称&#39; n&#39;和&#39; l&#39;即使在当前的背景下也毫无意义
答案 1 :(得分:0)
成功重新分配后删除免费。 Realloc会为您解决这个问题。此外,如果您遇到错误情况,您将加倍()缓冲区。