gpt4 book ai didi

c - 当我没有使用 malloc() 分配足够的内存时,为什么我的代码可以工作?

转载 作者:行者123 更新时间:2023-11-30 18:20:14 24 4
gpt4 key购买 nike

我正在 SPOJ 上做这个问题。 http://www.spoj.com/problems/NHAY/ 。它需要动态地获取输入。在下面的代码中,即使我没有使用 malloc() 将内存分配给 char *needle - 我正在使用 l = 1 - 但我我能够接受任意长度的输入,并且打印出整个字符串。有时它会给出运行时错误。当我没有为字符串分配足够的内存时,为什么会出现这种情况?

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

int main()
{
long long l;
int i;
char *needle;
while(1){
scanf("%lld",&l);
needle =(char *)malloc(sizeof(char)*l);
scanf("%s",needle);
i=0;
while(needle[i]!='\0'){
printf("%c",needle[i]);
i++;
}
free(needle);
}
}

我还在 stackoverflow 上读到,字符串是 char *,所以我应该声明 char *needle。我如何在代码中使用这个事实?如果我采用l = 1,那么无论输入字符串的长度是多少,它都应该包含最多为char *指针分配的内存的字符,即1个字节。我怎样才能做到这一点?

最佳答案

您的代码通过让 sscanf 将大于分配空间的字符串复制到 malloc 分配的内存中来故意产生缓冲区溢出。这是“有效的”,因为在大多数情况下,分配的缓冲区位于页面中间的某个位置,因此“仅”将更多数据复制到缓冲区中会覆盖相邻数据。 C(和 C++)不对普通 C 数组进行任何数组边界检查,因此错误未被捕获。

在出现运行时错误的情况下,您很可能将部分字符串复制到未映射和未分配的内存中,这会触发访问冲突。

内存通常是从底层操作系统以固定大小的页面分配的。例如,在 x86 系统上,页面大小通常为 4k。如果您要写入的映射地址距离页面的开头和结尾足够远,则整个字符串将适合页面的边界。如果距离上边界足够近,代码可能会尝试写入越过边界,从而触发访问冲突。

关于c - 当我没有使用 malloc() 分配足够的内存时,为什么我的代码可以工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27393036/

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