问题描述
当我希望使用 malloc 分配一些内存时,我尝试了以下方法:
(char *) conc_str = (char *) malloc(1);
char *conc_str2 = (char *)malloc(1);
然而,第一个给了我一个错误,说“标识符“conc_str”是 undefinedC/C++(20)”。为什么它会抛出错误而第二种分配内存的方式不会?使用 (char *)
与使用 char *
有什么区别?
解决方法
这一行:
(char *) conc_str = (char *) malloc(1);
是对名为 conc_str
的现有变量执行强制转换并尝试为强制转换结果赋值的语句。这是无效的,原因有两个:conc_str
尚未定义且无法分配强制转换的结果。
虽然这一行:
char *conc_str2 = (char *)malloc(1);
是变量 conc_str2
的定义,指定 char *
作为其类型,并使用 malloc
返回的值对其进行初始化。
此外,您不应强制转换 malloc
的返回值,因为它不是必需的,并且会掩盖代码中的其他问题。
您可以将声明符括在括号中,但不能将类型说明符括起来。
例如这些声明是有效的
char *conc_str2;
char * ( conc_str2 );
char ( *conc_str2 );
char ( * ( conc_str2 ) );
虽然编译器可以发出消息,说明使用了多余的括号。
至于这样的表达
(char *) conc_str
然后将已经(某处)声明的(如果确实声明了)变量 conc_str
强制转换为类型 char *
。
因此这个记录
(char *) conc_str = (char *) malloc(1);
不是声明而是赋值语句,即使变量 conc_str
已经声明,因为操作数 (char *) conc_str
是可能无法赋值的右值,它也是不正确的语句。