5

可能重复:
Realloc 未调整指针数组的大小

谁能告诉我我的错误在哪里?此函数应创建一个由 提供的字符组成的数组stdin。我阅读了一些相关的问题,但它太复杂了,我无法理解。

char *readChar(void)
{
    int c;
    int len = 0;
    char* parr = malloc(sizeof(char));

    while((c = getchar()) != EOF)
    {
        ++len;
        int size = sizeof(char)*len;
        parr = (char *) realloc(parr,size);
        *(parr+size-1) = (char) c;
        printf("Done! Size should be: %dB, but real size is %dB\n",size,sizeof(parr));
    }

    return parr;
}

输出:

完毕!大小应该是:1B,但实际大小是 8B 完成!大小应该是:2B,但实际大小是 8B 完成!大小应该是:3B,但实际大小是 8B 完成!大小应该是:4B,但实际大小是 8B

4

5 回答 5

8

错误是它sizeof()不会告诉您分配的字节数。它告诉你的大小char *

听起来您想要的是验证您是否分配了正确的内存量。sizeof()不会给你这些信息。此时处于低级细节中,您需要做一些依赖于操作系统的操作来尝试查找该信息。(例如,在 Linux 内核中,如果你有kmalloc()记忆,你可以用ksize()它来准确找出你得到了多少字节)

于 2012-10-10T18:33:35.007 回答
2

sizeof(parr)不是分配的空间量,它是char*(parr的数据类型) 的大小。了解您分配的内存量的唯一可移植方法是自己跟踪它。

假设realloc按预期工作,您分配的字节数将等于您的变量size

我在您的代码中注意到的其他几件事:

    char* parr = malloc(sizeof(char));

您应该始终检查 的返回值malloc以确保它成功:

 char* parr;
 if(!(par = malloc(sizeof(char)))
 {
     //allocation failed
 }

引起我注意的代码的下一部分:

 int size = sizeof(char)*len;

这实际上是不需要的。sizeof(char)始终等于一个字节,因此您不妨只使用当前值,而不是在循环的每次迭代中len声明一个等于等于的新变量。len * 1

  parr = (char *) realloc(parr,size);

如前所述,您不需要使用size,因为它等效于len. 同样在 C 中,转换指针通常不是一个好主意,您还应该检查 realloc 的返回值,以防它失败:

if(!(parr = realloc(parr, size)))
{
    //allocation failed
}

最后一点,我在使用该realloc函数时总是使用缓冲区以避免潜在的内存问题。这是我对您的代码的看法:

char *readChar(void)
{
    int c, len = 0;
    char* parr = NULL, char *tmp;

    if(!(parr = malloc(sizeof(char)))
    {
        fputs("memory allocation failed", stderr);
        exit(1);
    }

    while((c = getchar()) != EOF)
    {
        ++len;
        if(!(tmp = realloc(parr, len)))
        {
            free(parr);
            fputs("memory allocation failed", stderr);
            exit(1);
        }
        parr = tmp;
        *(parr+len-1) = (char) c;
    }
    return parr;
}
于 2012-10-10T18:33:40.607 回答
1

sizeof(parr)返回一个指针大小(在您的系统上为 8 个字节)。您需要使用strlen来找出实际的字符串大小(注意,字符串应以\0ie 结尾,以空值结尾)。

于 2012-10-10T18:34:03.880 回答
1

您无法使用 sizeof() 测量动态分配数组的大小,因为它是在编译期间评估的。在您的示例中,您使用的指针大小在 x64 架构上为 8B。

于 2012-10-10T18:34:44.177 回答
1

它为您提供sizeof每次打印时始终相同的指针。

没有办法知道指针指向的内存大小,您只需要自己跟踪它们即可。

顺便说一句,它保证sizeof(char)始终为 1。因此,您可以在对reallocand的调用中删除它们malloc。为了安全起见,您还应该检查 malloc 和 realloc 的返回值。

于 2012-10-10T18:35:17.873 回答