指针声明等效

时间:2016-02-16 01:47:25

标签: c pointers

char *charPtr = malloc(50);

char *charPtr; *charPtr = malloc(50);

我一直在用C创建指针,就像上面的例子一样。可以说这两个在C中是一样的吗?

3 个答案:

答案 0 :(得分:3)

  

可以说这两个在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

请注意,这样做(第二种情况)是错误的:

char *charPtr; 
*charPtr = malloc(50);  // <-- WRONG, the * here is deference operator

答案 1 :(得分:2)

不,他们不一样。在这种情况下

char *charPtr;
*charPtr = malloc(50);

你是

  1. 取消引用未初始化的指针,这会导致未定义的行为
  2. 指定不同大小的整数而不进行强制转换。虽然从指针到整数的转换以及另一种方式是根据标准定义的,但您应该考虑一些事项。如果此代码一直在为您工作,那是因为上面提到的 Undefined Behavior 。你永远不会知道它发生了,直到发生了可能一直发生或永远不会发生的事情,或者有时,你真的不知道。
  3. *在这里扮演两个不同的角色,第一种情况是

    char *charPtr;
    

    它只是表明charPtr是一个指针,而在

    *charPtr = malloc(50);
    

    它是取消引用运算符。

    当然,*也是乘法运算符,但编译器的解释取决于它出现的上下文。

答案 2 :(得分:1)

没有。第一个声明base_id = row[0][0..4] spouse = individuals.select { |individual| individual.ind_id[0..4] == base_id }.first 作为指向charPtr的指针,它包含char的返回值。

第二个声明malloc作为指向charPtr的指针。然后它表示值char指向的值应设置为charPtr的返回值。这是错的。指针未初始化,并指出它应指向的是未定义的行为。此外,将malloc分配给void *应生成编译器诊断。