【发布时间】:2015-02-08 04:14:51
【问题描述】:
我在 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 个字节。我该怎么做?
【问题讨论】:
-
未定义的行为是未定义的。有时它会崩溃,有时它似乎可以工作,但两次都不正确。
-
您分配了一些内存,但由于没有边界检查,它给您一种错觉,即您可以使用比您指定的更多的内存。如果在您分配的块之后有空闲内存,它不会崩溃,否则它将崩溃或覆盖那里的内存。
标签: c pointers memory memory-management dynamic-memory-allocation