c - 关于一个小内存分配程序的问题(41行)
问题描述
问题
“内存存储数组”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”?如果我分配 first = alloc(1) 然后分配 first = "First",它将起作用,并覆盖 allocbuf 的内容,对吗?
为什么该行
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++)
;
}
解决方案
你应该明白,如果你有一条线,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 个字节。
推荐阅读
- node.js - Yeoman 生成器错误:需要上游代理端口
- odoo - 为什么 Wkhtmltopdf 没有在 Odoo 中显示页眉和页脚?
- ruby-on-rails - 使用 Ruby-on-Rails 和 MiniTest 存根
- node.js - 检查用户是否在 Express 中打开了静态文件?
- kubernetes - 在 Kubernetes 集群的所有节点上运行守护程序集
- python - Jupyter notebook 内核未连接 StreamClosedError
- javascript - 如何使用 Javascript、jQuery 对提交按钮应用多个操作?
- rest - 使用 Kotlin 协程的 Guava LoadingCache
- c# - 需要从 UWP 使用智能卡上的私钥解密 smime p7m 文件
- java - Mapreduce不同的key产生不同数量的消息