问题


“内存存储阵列” 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”;如果要打印“第一”,是否必须使用for循环for (i = 0; i < 6; i++) {print allocbuf[i];}来打印“第一”?
如果我先分配= alloc(1),然后再分配first =“ First”,它将起作用,并覆盖allocbuf的内容,对吗?
为什么printf("allocbuf: %s\n", allocbuf);行不能在我的代码中打印出allocbuf的内容?


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

我很高兴阅读有关此程序,功能和内存分配的任何注释,尽管它们可能无法回答我的特定问题。因此,请与我分享您的知识和经验。谢谢 :)

附言我在《 K&R C编程》第二版中没有遇到过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++)
            ;
}

最佳答案

您应该了解,如果您将cp = "2"作为一行,


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


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

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


第一条语句中发生的事情是从静态缓冲区allocbuf分配了内存,而分配的内存的地址存储在first中。使用第二条语句,您将用只读存储器中的某个位置覆盖指针first。因此,您失去了先前分配的指针,并且内存泄漏

如果使用的是alloc,则应使用First将数据strcpy复制到内存中

strcpy(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]将是\0,因为您没有修改occupyalloc变量。

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

10-05 23:49