【问题标题】:How can I do this type conversion?我该如何进行这种类型转换?
【发布时间】:2013-05-25 15:22:05
【问题描述】:

我的代码在这里。

struct process *init_process (char *programName, int startTime, int cpuTime) {
    struct process *proc;
    proc = (malloc(sizeof(struct process)));
    if (proc == NULL) {
        printf("Fatal error: memory allocation failure.\nTerminating.\n");
        exit(1);
    }
    proc->programName = programName;
    proc->cpuTime = cpuTime;
    proc->startTime = startTime;
    proc->next = NULL;
    return(proc);
};

编译器在第 3 行显示“错误:从‘void*’到‘process*’的无效转换”。 我尝试使用 process*(malloc(sizeof(struct process))) 进行类型转换,但编译器这次说 'error: expected primary-expression before'*' token'。

谁能帮我解决这个问题?

【问题讨论】:

  • try proc = (struct process *)malloc(sizeof(struct process));
  • 您不需要从malloc() 转换返回值。你能发布 struct pls 的定义吗?
  • 您正在使用 C++ 编译器。要么编写 C++ 代码,要么切换到 C 编译器。
  • @Jimbo:从void* 到其他指针类型的隐式转换在 C 中有效,但在 C++ 中无效。 OTOH a ; 在函数定义后不是有效的 C 但有效的 C++。
  • 我会考虑使用 calloc() 而不是 malloc()。还可以考虑将 process_init() 重命名为 process_new() 或 process_alloc() 以明确它分配内存。

标签: c++


【解决方案1】:

在 C++ 中,您应该使用新的样式转换:

    proc = static_cast<process *>(malloc(sizeof(struct process)));

但是,如果你真的在使用 C++ 编译器,你真的应该使用 new/new[] 进行动态分配(并使用 delete/delete[] 进行释放)。

    proc = new process;

如果您要将 C 代码移植到 C++,并且不想修改当前的 malloc() 调用,可以尝试添加以下内容:

#ifdef __cplusplus
namespace cxx {
    class voidptr {
        void *p_;
    public:
        voidptr (void *p = 0) : p_(p) {}
        template <typename T>
        operator T * () const { return static_cast<T *>(p_); }
    };
    voidptr malloc (size_t sz) { return ::malloc(sz); }
    voidptr calloc (size_t cnt, size_t sz) { return ::calloc(cnt, sz); }
    voidptr realloc (void *p, size_t newsz) { return ::realloc(p, newsz); }
}
#define malloc(x) cxx::malloc(x)
#define calloc(x,y) cxx::calloc(x,y)
#define realloc(x,y) cxx::realloc(x,y)
#endif

Works for C.Works for C++.

【讨论】:

  • using cxx::malloc; 代替宏怎么样
  • 问题在于标准 C 函数的歧义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2016-09-29
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
相关资源
最近更新 更多