如何将 space 保存在未使用的数组中?
How can i save space in array which is not being used?
如果我创建一个大小为 10 的数组,并且只有 2 个元素存储在数组中,那么剩余的空间就会被浪费。那么我该如何解决这个问题呢? (按数据结构)
在大多数情况下,您会使用动态内存分配。这意味着调用 malloc
来获取初始内存量,然后在 space 耗尽时调用 realloc
,最后调用 free
到 return记忆到江湖。这是一个从标准输入中读取一行的函数。它 return 是动态分配的内存
#define INITALLOC 16 /* #chars initally alloced */
#define ALLOCSTEP 8 /* #chars to realloc by */
int getline(char **dynline)
{
int i, c;
size_t nalloced; /* #chars currently alloced */
if ((*dynline = malloc(INITALLOC)) == NULL)
return -1; /* return -1 on mem. err */
nalloced = INITALLOC;
for (i = 0; (c = getchar()) != EOF; ++i) {
/* buffer is full; request more mem */
if (i == nalloced)
if ((*dynline = realloc(*dynline, nalloced += STEP)) == NULL)
return 0;
/* store the newly read character */
(*dynline)[i] = c;
}
/* zero terminate the string */
(*dynline)[i] = '[=10=]';
if (c == EOF)
return 0; /* return 0 on EOF */
return 1;
}
此函数的用户负责释放内存。例如:
char *buf;
printf("What is your full name?\n");
if (getline(&buf) > 0)
puts(buf);
free(buf);
当然还是有一些浪费,但是用数组是解决不了的。考虑一个链表 https://www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/linked%20lists.html
您可以使用简单的链表而不是数组,或者如果您需要使用数组,那么您应该使用 realloc()
,这会将数组缩小为仅使用 2 个单元格,而不是10.
,像这样:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* ptr = malloc(10 * sizeof(int));
ptr[0] = 4;
ptr[1] = 13;
ptr = realloc(ptr, 2 * sizeof(int));
printf("%d %d\n", ptr[0], ptr[1]);
return 0;
}
输出:
4 13
如果我创建一个大小为 10 的数组,并且只有 2 个元素存储在数组中,那么剩余的空间就会被浪费。那么我该如何解决这个问题呢? (按数据结构)
在大多数情况下,您会使用动态内存分配。这意味着调用 malloc
来获取初始内存量,然后在 space 耗尽时调用 realloc
,最后调用 free
到 return记忆到江湖。这是一个从标准输入中读取一行的函数。它 return 是动态分配的内存
#define INITALLOC 16 /* #chars initally alloced */
#define ALLOCSTEP 8 /* #chars to realloc by */
int getline(char **dynline)
{
int i, c;
size_t nalloced; /* #chars currently alloced */
if ((*dynline = malloc(INITALLOC)) == NULL)
return -1; /* return -1 on mem. err */
nalloced = INITALLOC;
for (i = 0; (c = getchar()) != EOF; ++i) {
/* buffer is full; request more mem */
if (i == nalloced)
if ((*dynline = realloc(*dynline, nalloced += STEP)) == NULL)
return 0;
/* store the newly read character */
(*dynline)[i] = c;
}
/* zero terminate the string */
(*dynline)[i] = '[=10=]';
if (c == EOF)
return 0; /* return 0 on EOF */
return 1;
}
此函数的用户负责释放内存。例如:
char *buf;
printf("What is your full name?\n");
if (getline(&buf) > 0)
puts(buf);
free(buf);
当然还是有一些浪费,但是用数组是解决不了的。考虑一个链表 https://www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/linked%20lists.html
您可以使用简单的链表而不是数组,或者如果您需要使用数组,那么您应该使用 realloc()
,这会将数组缩小为仅使用 2 个单元格,而不是10.
,像这样:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int* ptr = malloc(10 * sizeof(int));
ptr[0] = 4;
ptr[1] = 13;
ptr = realloc(ptr, 2 * sizeof(int));
printf("%d %d\n", ptr[0], ptr[1]);
return 0;
}
输出:
4 13