首页 > 解决方案 > 关于一个小内存分配程序的问题(41行)

问题描述

问题

  1. “内存存储数组”allocbuf[10] 是否将所有内容背靠背保存。例如,allocbuf[10] 已满 {F, i, r, s, t, \0, S, e, c, \0] 并且我将说明 allocbuf 是如何变满的。我想我保存到 allocbuf 中的所有信息都会背靠背保存。因此,作为示例,在使用alloc(6)并将返回的字符指针分配给变量char *first之后,字符指针“first”指向 allocbuf[0]。现在我分配, first = "First"; 如果我想打印“First”,是否必须使用 for 循环for (i = 0; i < 6; i++) { print allocbuf[i]; }来打印“First”?

  2. 如果我分配 first = alloc(1) 然后分配 first = "First",它将起作用,并覆盖 allocbuf 的内容,对吗?

  3. 为什么该行printf("allocbuf: %s\n", allocbuf);没有打印出我的代码中 allocbuf 的内容?

我相信我会对这个程序的更多功能感兴趣,我很高兴能得到你的帮助。

我很高兴阅读有关该程序、功能和内存分配的任何评论,尽管他们可能无法回答我的具体问题。因此,请与我分享您的知识和经验。谢谢 :)

PS 我还没有在我的书 K&R C Programming 2nd ed 中遇到 malloc(),但是,请不要评论说使用 malloc()。

代码

char *alloc(int); //return pointer to free storage in allocbuf[10]
void afree(int *); //free storage in allocbuf[10]
void strcpy2(char *, char *); //copy to, from
static char allocbuf[10];
static char* allocp = allocbuf;

main()
{
    char array4[5] = "4444";
    char* cp = "overwritten";
    char* copy = array4;
    char* occupyalloc;

    printf("cp: %s\n", cp); //"overwritten"
    printf("copy: %s\n", copy); //"4444"

    cp = "2"; //overwrite *cp = "overwritten" with *cp = "2"
    printf("cp: %s\n", cp); //"2"

    occupyalloc = alloc(4); //returns allocp 0, intended storage space is allocbuf[0] through allocbuf[3]

    cp = alloc(3); //returns allocp 4, intended use is allocbuf[4] through allocbuf[6]

    strcpy2(cp, copy); //copies "4444" into *cp, specifically allocbuf[4] through allocbuf[7]

    printf("cp: %s\n", cp); //"4444" , stored in allocbuf[4] through allocbuf[7] improperly
    printf("allocbuf: %s\n", allocbuf); //prints allocbuf -- not working
}

char *alloc(int n)
{
    if (allocbuf + ALLOCSIZE - allocp >= n) 
    {
        allocp += n;
        return allocp - n;
    }
    else
        return 0;
}

void afree(int *initial_storage_element_location)
{
    if (initial_storage_element_location >= allocbuf && initial_storage_element_location < allocbuf + ALLOCSIZE) 
        allocp = initial_storage_element_location;
}

void strcpy2(char *s, char *t)
{
    while (*s++ = *t++)
            ;
}

标签: cmemorymemory-managementalloc

解决方案


你应该明白,如果你有一条线,cp = "2"那么

  • 编译器将字符串文字创建为"2".
  • 此字符串文字通常存储在内存的只读位置。
  • 字符串文字的地址存储在指针中cp

现在,如果您使用动态内存分配作为

 char *first = alloc(6);
 first = "First";

第一条语句中发生的情况是从静态缓冲区allocbuf分配内存,分配内存的地址存储在first. 使用第二个语句,您将first用只读存储器中的位置覆盖指针。所以你松开了先前分配的指针,你有内存泄漏

如果您正在使用alloc,您应该将数据复制First到内存中strcpy

strcpy(first, "First")

如果我分配 first = alloc(1) 然后分配 first = "First",它将起作用,并覆盖 allocbuf 的内容,对吗?

不,您没有覆盖其中的内容,allocbuf而是使用新指针来读取只读内存。

为什么行 printf("allocbuf: %s\n", allocbuf); 不在我的代码中打印出 allocbuf 的内容?

我将在发布的代码的上下文中回答这个问题。

occupyalloc = alloc(4); //returns allocp 0, intended storage space is allocbuf[0] through allocbuf[3]
cp = alloc(3); //returns allocp 4, intended use is allocbuf[4] through allocbuf[6]
strcpy2(cp, copy); //copies "4444" into *cp, specifically allocbuf[4] through allocbuf[7] 

printf("cp: %s\n", cp); //"4444" , 通过 allocbuf[7] 不正确地存储在 allocbuf[4] printf("allocbuf: %s\n", allocbuf); //打印 allocbuf -- 不工作

在这种情况下,allocbuf[0]will be \0,因为您没有修改occupyalloc变量。

另请注意,这"4444"需要 5 个字节,而您只分配 3 个字节。


推荐阅读