C-我需要采取哪些步骤,然后才能以相同的变量名称在循环中使用的相同的变量名称

  • 本文关键字:变量名 循环 然后 c while-loop malloc
  • 更新时间 :
  • 英文 :


在循环中,我会有一定数量的内存,用它来存储一些字符串。

当循环发生时,我将不得不将另一个内存量到同一内存我使用过的可变。内存的量取决于用户的输入。代码就像以下(我已经简化了)

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;
}

完成了messageprintf之后)后,您应该将free (message)释放。

另外,您可以realloc而不是malloc -ing。

相关内容

  • 没有找到相关文章

最新更新