从void *转换为char *

时间:2012-05-21 18:09:01

标签: c++ c

#include <stdio.h>
#include <stdlib.h>

int main() {
    void *malloc(size_t size);
    char *ptr, *retval;
    ptr = (char *)calloc(10, sizeof(char));

    if (ptr == NULL)
        printf("calloc failed\n");
    else
        printf("calloc successful\n");

    retval = realloc(ptr, 5);

    if (retval == NULL)
        printf("realloc failed\n");
    else
        printf("realloc successful\n");

    free(ptr);
    free(retval);
}

这是我的代码错误出现在第14行,它说

  

从“void *”无效转换为“char *”

4 个答案:

答案 0 :(得分:9)

你可以像使用malloc那样将realloc的结果加到(char *)。

retval = (char*)realloc(ptr, 5);

具有讽刺意味的是,虽然你所写的是完全合法的“C”代码......但不是你需要演员的C ++。因此,您可能还尝试将编译器设置为将代码编译为“C”,因为您没有使用任何C ++,这同样可以解决问题。那说上面的修改也是完全合法的C ...所以会在C ++和C下编译。

编辑:正如softy正确地指出你重新分配ptr并将指针位置存储到retval中,这意味着ptr可能指向无效的内存,你不应该释放它。充其量你可以释放两次相同的内存,最坏的情况是你可以释放已经释放的内存(通过realloc)。无论哪种方式都很糟糕(tm)。因为它是你正在调用一些严重的“未定义的行为”。

答案 1 :(得分:1)

你无法释放指针两次。这里的retval和ptr都指向同一个位置 添加此代码并在免费通话前检查:

printf("%p \n ",ptr);
printf("%p \n",retval);

realloc缩小了大小,但指针位置保持不变。 你可以试试这个:

if(ptr == retval)

/* delete either ptr or retval - just for sake of this programm , Idealy you shouldnt free the the pointer like this as Rightly Suggested by **Goz** in C++/c*/

只是为了使它工作。否则它会通过gcc编译好但是如果你运行它会给你一个脏堆栈跟踪,因为你试图释放相同的指针两次。内存分配函数的底层中断调用可能会也可能不会为它指定相同的指针.IF你扩展大小可能是30或50它可能会给你不同的指针。

RGDS, 软质皮

答案 2 :(得分:1)

其他人已经注意到您的C代码正在编译为C ++代码。在C中不需要强制转换,但在C ++中是必需的。在C ++中,您应该使用向量(或字符串)。

以下是对您的代码的一些观察:

  1. 不要重新声明malloc。包括stdlib.h将为您做到这一点。值得庆幸的是,您已成功复制其声明,因此它只是多余的(并且让其他人在阅读代码时感到困惑)。如果您声明错误,则表示您有未定义的行为。

  2. 不要免费“ptr&#39;如果realloc成功。

  3. 有些人可能会指出,在某些深奥的系统中,calloc可能无法达到您的预期(特别是指针和浮点类型)。考虑到您希望用适当的值初始化动态分配的空间,调用calloc比使用malloc更加多余。

答案 3 :(得分:0)

如果要编译它,请使用C编译。看起来好像在使用C ++编译。它是有效的C但不是有效的C ++。在大多数使用小写.c扩展名的编译器中,编译器会自动使用C编译。 .cpp会导致C ++编译,也.C(大写)可能会导致C ++编译(例如在gcc中)。