假设我正在尝试在运行时读取未知大小的字符串并打印它:
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);
,它就可以正常运行。
这可能是什么原因以及如何解决?
答案 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
数组的分配将使索引0
到n-1
的有效位置要写入。写入str[n]
会导致堆损坏,进而导致对free(str)
的调用是未定义的行为。
您需要为包含n+1
个字符的字符串分配至少n
个字节,以说明空终止符。