" CRT检测到应用程序在堆缓冲区结束后写入内存"?当我在C

时间:2017-10-22 22:19:06

标签: c

#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;是必不可少的。那么我怎样才能正确释放内存?

1 个答案:

答案 0 :(得分:0)

  

应用程序在堆缓冲区结束后写入内存

这听起来像你的程序在inputStr指针数组结束后写入内存,或者可能超过其中一个字符串缓冲区的末尾。但是,您发布的代码似乎没有这个问题。也许你无意中在/* do something */部分的某个缓冲区的末尾做了一些事情?

正如BLUEPIXY建议的那样,你确实有一个潜在的堆栈缓冲区溢出问题:如果你将超过15个字符读入str,那么你将覆盖堆栈内存。当strlen(str)的内容是未初始化的堆栈垃圾时,调用str是没有意义的。