#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
printf("Input 10 string\n");
char** inputStr = (char**)malloc(sizeof(char*) * 10);
for (int i = 0; i < 10; i++) {
char str[16];
int len = strlen(str);
printf("String %d : ", i + 1);
scanf("%s", str);
*(inputStr + i) = (char*)malloc(sizeof(char) * (strlen(str) + 1));
strcpy(*(inputStr + i), str);
}
/*
do something
*/
for (int i = 0; i < 10; i++) {
free(*(inputStr + i));
}
free(inputStr);
return 0;
}
当我在VisualStudio 2017中执行此代码时,出现错误,显示消息&#34; CRT检测到应用程序在堆缓冲区结束后写入内存&#34;。
我删除了使用&#39; free&#39;的代码部分。关键字,然后它正常工作。
但是我了解到使用&#39; free&#39;之后&#39; malloc&#39;是必不可少的。那么我怎样才能正确释放内存?
答案 0 :(得分:0)
应用程序在堆缓冲区结束后写入内存
这听起来像你的程序在inputStr
指针数组结束后写入内存,或者可能超过其中一个字符串缓冲区的末尾。但是,您发布的代码似乎没有这个问题。也许你无意中在/* do something */
部分的某个缓冲区的末尾做了一些事情?
正如BLUEPIXY建议的那样,你确实有一个潜在的堆栈缓冲区溢出问题:如果你将超过15个字符读入str
,那么你将覆盖堆栈内存。当strlen(str)
的内容是未初始化的堆栈垃圾时,调用str
是没有意义的。