gpt4 book ai didi

c - 缓冲区大小和两个地址之间的距离有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:43 26 4
gpt4 key购买 nike

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

int main()
{
char *name;
char *command;
name=(char *)malloc(10);
command=(char *)malloc(128);
printf("address of name is : %d\n",name);
printf("address of command is:%d\n",command);
printf("Distance between addresses is :%d\n",command-name);
printf("Enter your name:");
gets(name);
printf("Hello %s\n",name);
system(command);
}

分配恒定数量的内存(缓冲区大小)和两个地址之间的距离(相邻内存块)有什么区别?在此示例中,名称和命令之间的差异为 16 字节,名称的缓冲区大小为 10 字节。哪一个会触发缓冲区溢出?

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

// typedef size_t u_long;

int main(){
u_long distance;
char *buf1= (char *)malloc(16);
char *buf2= (char *)malloc(16);
distance= (u_long)buf2 - (u_long)buf1;
printf("buf1 = %p\nbuf2 = %p\ndistance = 0x%x bytes\n",
buf1, buf2, distance);
memset(buf2, 'A', 15); buf2[15]='\0';
printf("before overflow buf2 = %s\n", buf2);
memset(buf1, 'B', (8+distance));
printf("after overflow buf2 = %s\n", buf2);
return 0;
}

最佳答案

因为 namecommand 是通过分别调用 malloc() 来分配的,所以它们的地址之间的差异严格来说是没有意义的。指针运算仅适用于同一数组或同一分配 block 中的地址。当然,减去两个指针会给你一个数字,你不能用它做任何事情。没有理由相信 malloc() 会使用相邻的内存块,甚至后面的分配会比前面的分配有更高的地址。它可以根据需要自由分配。

您分配了 10 个字节,因此您可以使用 10 个字节。就是这样。

关于c - 缓冲区大小和两个地址之间的距离有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16887116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com