realloc不是changíng数组的大小

时间:2012-10-10 18:31:46

标签: c arrays realloc

  

可能重复:
  Realloc is not resizing array of pointers

谁能告诉我我的错误在哪里?此函数应该生成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

5 个答案:

答案 0 :(得分:7)

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

的大小

听起来你想要的是验证你分配了正确的内存量。 sizeof()不会向您提供该信息。在这一点上,它处于低级别的细节中,您需要做一些依赖于OS的东西来尝试找到这些信息。 (例如,在Linux内核中,如果你kmalloc()内存,你可以使用ksize()来确切地知道你得到了多少字节数。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

没有办法告诉指针指向的内存大小,你只需要自己跟踪它们。

顺便说一句,保证sizeof(char)始终为1.所以您可以在致电reallocmalloc时将其删除。您还应该检查malloc和realloc的返回值,以确保安全。