calloc()、类型转换和指针

calloc()、类型转换和指针,c,C,我是C的新手 我知道这是正确的: char* Str; Str = (char*)calloc(Str_Len, sizeof(char)); ,但为什么这是不正确的 char* Str; *Str = (char*)calloc(Str_Len, sizeof(char)); 如何修改它?谢谢。第一个是合法的,但是在C中(因为它们的返回类型是void*)。 在第二种情况下,Str是char类型,您不能为其分配超过n1字节的内存。另外,calloc返回指针,但是*Str属于char类型。您不

我是C的新手

我知道这是正确的:

char* Str;
Str = (char*)calloc(Str_Len, sizeof(char));
,但为什么这是不正确的

char* Str;
*Str = (char*)calloc(Str_Len, sizeof(char));
如何修改它?谢谢。

第一个是合法的,但是在C中(因为它们的返回类型是
void*
)。

在第二种情况下,
Str
char
类型,您不能为其分配超过n
1
字节的内存。另外,
calloc
返回
指针
,但是
*Str
属于
char
类型。您不能将
char*
数据类型分配给
char
类型。

实际上两者都不正确,因为不需要在C中向另一个类型强制转换
void*
类型,它是隐式可转换的。强制转换本身不是错误,但可能导致隐藏错误

后者是错误的,因为
*Str
取消了对指针的引用(因此您可以访问
char
),该指针不是指针类型,也不能从指针分配

char* Str;
Str = calloc(Str_Len, sizeof(char));

是正确的

,因为
calloc
返回一个指针,并且您正试图将其分配给
char
。此外,您还可以转换返回值。“如何修改它?”——答案似乎相当明显。你知道第一段是正确的,第二段不是。所以使用第一个。但编写它的更好方法是
char*Str=calloc(Str_Len,sizeof*Str)。因此,您可能不需要将第一个字节归零,因此:
char*Str=malloc(Str_Len);Str[0]='\0'
sizeof(char)
根据定义为1)在第一种情况下,强制转换calloc是正确且有效的代码。如果有人认为某件事是不好的做法,这并不意味着在谈论由特定规则定义的语言时它是不正确的。@self.-正确有效,但在风格上也令人憎恶。你认为这是什么,C++ + @自我:一个不必要的强制编译器迫使忽略类型检查,所以它不仅仅是美学上的坏处。你是说你会得到一个关于
char*x=(char*)malloc(sizeof(int))的诊断
?@self:这就是为什么推荐的做法是编写
T*p=malloc(sizeof*p*N)。不必担心所有类型的笔直。无论您将
T
更改为什么,您都会得到正确的内存分配量。