请考虑以下代码:
#include "stdafx.h"
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>
struct Person {
char *name;
int age;
int height;
int weight;
};
struct Person *Person_create(char *name, int age, int height, int weight)
{
struct Person *who = (struct Person*) malloc(sizeof(struct Person));
assert(who != NULL);
who->name = strdup(name);
who->age = age;
who->height = height;
who->weight = weight;
return who;
}
好奇的是
struct Person *who = (struct Person*) malloc(sizeof(struct Person));
我在网上搜索了一下malloc()用法。大约一半是用铸造写的,有些则不是。在vs2010上,没有出现(struct Person*)
错误:
1>c:\users\juhyunlove\documents\visual studio 2010\projects\learnc\struct\struct\struct.cpp(19): error C2440: 'initializing' : cannot convert from 'void *' to 'Person *'
1> Conversion from 'void*' to pointer to non-'void' requires an explicit cast
那么创建指针并为其分配内存的正确方法是什么?
答案 0 :(得分:14)
因为您使用的是C ++编译器。
C ++中需要强制转换malloc
(假设类型不是void *
)。在C中,它不是必需的,甚至建议不要强制转换malloc
。
在C中,在赋值期间存在从void *
到所有对象指针类型的隐式转换。
void *p = NULL;
int *q = p; // valid in C, invalid in C++
答案 1 :(得分:1)
如果将文件从struct.cpp重命名为struct.c,编译器将执行您希望C编译器执行的操作,而不是执行C ++编译器应执行的操作(如上所述)。 Visual Studio附带了一个可以同时执行C和C ++的编译器,所以它只是在创建文件时正确命名文件的情况。
我不确定在visual studio中重命名文件是否足够,或者如果你必须添加一个名为struct.c的新文件,将现有文件中的内容复制到其中,然后删除原始struct.cpp 。后者绝对有效。