问题
“内存存储阵列” 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个字节。