一个在c中使用动态内存分配的程序

我正在做一个程序,这里用户将输入一个字符串,如果用户输入“END”则程序将终止,否则它会要求另一个字符串和另一个但是字符串的大小是未知的,所以我必须使用动态内存分配以获取未知大小的字符串 这是我尝试过的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

int main() 
{
    bool on = true;
    char *string;
    while(on)
    {
        string = malloc(sizeof(char));
        int i;
        for (i = 0;; i++)
        {
            int n;
            n = getchar();
            if (n == 'n')
            {
                break;
            }
            else
            {
                string = realloc(string, sizeof(char));
                string[i] = (char)n;
            }
        }
        string[i] = '';
        if (strcmp(string, "END") == 0)
        {
            on = false;
        }
        printf("Len: [%i],String = %sn",i+1,string);
        free(string);
    }
    return 0;
}

但是如果我输入一个超过 25 左右的字符串,程序就会崩溃,它给了我这个 putput

0 [main] get_the_line_dynamically 1056 cygwin_exception::open_stackdumpfile: Dumping stack trace to get_the_line_dynamically.exe.stackdump

但是,这段代码有什么问题??

回答

realloc()分配您指定的大小,当大小增加时,它将数据从原始分配复制到新分配,然后将旧数据返回到堆。您传递的大小不是增量,而是绝对大小,而不是大小增加

因此,您需要:

string = realloc( string, i + 2 ) ;
string = realloc( string, i + 2 ) ;

然而,以单个字节递增是非常低效的,需要为每个单个字节进行分配、数据复制和释放。正常的过程是在更大的块中增加容量,只有在超过当前容量时才增加分配。所以你可能有:

然后:

#define STRING_CAPACITY_INCREMENT 32
size_t string_capacity = STRING_CAPACITY_INCREMENT ;
char* string = malloc( string_capacity ) ;

这将提高时间性能,但如果您担心内存使用情况,请记住内存分配是 8 字节对齐的,因此与例如 8 的容量增量相比,单字节增量没有任何节省。同样出于这个原因,增量也应该是 8 的倍数。

在某些情况下,您可能会选择指数容量增加,例如加倍:8、16、32、64 等到某个合理的限制,然后它变成线性。如果您有很多小字符串而只有几个长字符串,这在平衡性能和内存使用方面可能会更好。


以上是一个在c中使用动态内存分配的程序的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>