释放分配的内存会导致程序卡在Visual Studio中,但不会卡在CodeBlocks中

时间:2019-02-16 19:27:36

标签: c visual-studio codeblocks

假设我正在尝试在运行时读取未知大小的字符串并打印它:

int n = 0;
printf("Enter word size:\n");
scanf("%d", &n);
char *str = (char*) malloc(n*sizeof(char));
if (str == NULL) {
    printf("Malloc failed\n");
    return 0;
}
printf("Enter string:\n");
char c;
int i = 0;
while (i < n&&scanf(" %c", &c) == 1) {
    str[i] = c;
    i++;
}
str[n] = '\0';
printf("Your string is: %s\n", str);
free(str);

当我尝试在CodeBlocks中运行该程序时,它运行良好,但是当我尝试在Visual Studio(2017)中运行该程序时,它卡住了,如果我注释掉free(str);,它就可以正常运行。

这可能是什么原因以及如何解决?

2 个答案:

答案 0 :(得分:1)

char *str = (char*) malloc(n*sizeof(char));

但是

str[n] = '\0';

您需要再分配1个:

char *str = (char*) malloc(n+1);

否则,您将在分配的块之后写一个不确定的行为

请注意,sizeof(char)的定义为1,因此无法与之相乘。演员表也没用

答案 1 :(得分:0)

您没有分配足够的空间来说明字符串中的空终止符。大小为n数组的分配将使索引0n-1的有效位置要写入。写入str[n]会导致堆损坏,进而导致对free(str)的调用是未定义的行为。

您需要为包含n+1个字符的字符串分配至少n个字节,以说明空终止符。