在循环中,我会有一定数量的内存,用它来存储一些字符串。
当循环发生时,我将不得不将另一个内存量到同一内存我使用过的可变。内存的量取决于用户的输入。代码就像以下(我已经简化了)
int thisMany;
char *message = NULL;
while (1)
{
printf("How many characters will you type?");
scanf("%dn", thisMany);
message = malloc(sizeof(char*)*(thisMany+1));
message[thisMany+1] = ' ';
for (;thisMany > 0; thismany--)
{
message[thisMany] = a;
}
printf("%s", message);
/* this is the stage where I don't know what to do with 'message'
in order for the code to work after the loop */
}
我尝试使用"免费(消息)"和其他一些东西。请让我知道,如果您知道可以使这项工作的东西。
while (1)
{
printf("How many characters will you type?");
scanf("%dn", thisMany);
您在这里的分配是不正确的:您想分配给定数量的字符的炭指针。所以应该是:
message = (char *)malloc(sizeof(char)*(thisMany+1));
// Always verify *allocs. They're mischievous at best, and often evil.
if (NULL == message) {
fprintf(stderr, "Out of memory!n");
exit(-1);
}
没有损害,因为大小(char *)比大小(char)大四个或八倍,因此您分配了比必要的更多的内存。但是现在,这条代码变得危险:
message[thisMany+1] = ' ';
您已分配了Thismany 1个字符,从0到Thismany。因此,本尼 第1个字符落在分配的内存之外;所谓的"逐个"缓冲区溢出。应该是:
// One less than the number given to malloc()
message[thisMany] = ' ';
最后:
/* this is the stage where I don't know what to do with 'message'
in order for the code to work after the loop */
您需要做的是 free 您分配的内存。
free(message); message = NULL;
对null的消息重新分配并不是严格必要的,但我发现它非常有用。被释放后,message
仍然指向分配的内存区域,该区域仍然具有相同的内容。所以你可以做
free(message);
printf("%sn", message);
和有时,也许经常,它实际上会起作用,隐藏了潜在的灾难性错误。
将消息设置为无效,可以保证不会发生这种情况,并提高了任何不当用法都将足够明显以立即被捕获的机会。这使得在这方面的行为确定性,这对于捕获错误的情况要好得多。
如已经指出的一种替代方案是在循环前将消息设置为null,然后使用realloc
而不是malloc
。通过零参数时,realloc()
的表现就像malloc
一样:
message = NULL;
for (;;) {
// Loop
message = realloc(...);
if (NULL == message) {
...
}
}
// finally free message outside the loop.
// Checking that it is *not* NULL, in case the check above did not exit
// but just, say, printed an error message and exited the loop via break
if (message != NULL) {
free(message); message = NULL;
}
完成了message
(printf
之后)后,您应该将free (message)
释放。
另外,您可以realloc
而不是malloc
-ing。