马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 foxiangzun 于 2022-7-9 13:33 编辑
今日突发奇想,打算写个函数,收集控制台输入的字符信息,之前玩过了 Python 的操作,觉得太简单了,想用 C/C++ 试试,不曾想,各种想不明白。。不废话了,直接上代码。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int inputNum = 0;
printf("Please enter a number: ");
scanf("%d", &inputNum);
char *arr = NULL;
arr = (char *)malloc(inputNum * sizeof(char));
if (arr == NULL)
{
printf("Memery initial fause~");
return 0;
}
printf("Please enter a word: ");
scanf("%s", arr);
for (int i = 0;; i++)
{
if (*(arr + i * sizeof(char)) != '\0')
{
printf("%c\t", *(arr + i * sizeof(char)));
}
else
{
break;
}
}
return 0;
}
上述代码在 vscode 和 codeblocks 中顺利编译通过并正常运行,但是后来有个地方细思极恐,就是这里我输入的字符数量一旦大于最开始输入的数值,那么会不会造成内存溢出呢(如果有的话,可以加个长度校验,然后用 realloc 关键字来处理),于是试了下,结果。。
这下把我给整不会了。。然后跑到 codeblocks 里试了试(codeblocks 里写的是 C++),结果。。
好家伙。。本应报错的,但是这里顺利通过了。。警告甚至都没有。。难道内存会自动分配?也不对呀。。malloc 关键字是在输入字符之前用的呀。。难道操作系统会自动分配?在此求教各位大佬,帮忙解答下。谢谢
实际上已经溢出了,只是刚好溢出的内存还可以访问也没有被覆盖而已。
这些问题要靠程序员自己控制,C的设计理念就是这样,给程序员足够大的自由度。
当然了有些编辑器和编译器提示就比较丰富一点,比如微软的 visual studio、msvc 编译器这方面提示就比较丰富,很多小问题都会有提示。
|