char *charPtr = malloc(50);
char *charPtr; *charPtr = malloc(50);
我一直在用 C 创建指针,如上面的例子。可以说这两者在 C 中是相同的吗?
可以说这两者在 C 中是相同的吗?
否,您需要初始化指针。
char *charPtr = malloc(50); // initialization
或者,您先声明它,然后再分配它:
char *charPtr; // declaration
charPtr = malloc(50); // <-- assignment - do NOT add * here as the you already declared `charPtr` as a pointer
请注意,像您那样做(第 2 种情况(是错误的:
char *charPtr;
*charPtr = malloc(50); // <-- WRONG, the * here is deference operator
不,它们不一样。在这种情况下
char *charPtr;
*charPtr = malloc(50);
你是
- 取消引用未初始化的指针,这将导致未定义的行为。
- 在不强制转换的情况下将指针分配给不同大小的整数。尽管从指针到整数的转换和其他方式是根据 c 标准定义的,但您应该考虑一些事项。如果此代码一直为您工作,那是因为上面提到的未定义行为。你永远不会知道它正在发生,直到一些不好的事情发生,这些事情可能一直发生,或者永远不会发生,或者有时,你真的永远不知道。
在第一种情况下,*
在这里扮演着两个不同的角色
char *charPtr;
它只是指示charPtr
是一个指针,而在
*charPtr = malloc(50);
它是取消引用运算符。
当然,*
也是乘法运算符,但编译器对它的解释取决于它出现的上下文。
No.第一个声明charPtr
为指向char
的指针,它包含返回值 malloc
。
第二个声明charPtr
为指向char
的指针。然后它说charPtr
指向的值应设置为 malloc
的返回值。这是错误的。指针是未初始化的,说出它应该指向什么是未定义的行为。此外,将void *
分配给char
应生成编译器诊断。