在这个例子中,char **和char *之间的区别是什么?

时间:2015-08-26 05:42:24

标签: c pointers

char** surname;
surname = (char**) malloc(size*sizeof(char*));

char* middle_initial;
middle_initial = (char*) malloc(size*sizeof(char));

for(int i = 0; i<5;i++){       
  surname[i] = (char*) malloc(surname_max*sizeof(char));
  middle_initial[i] = *(char*) malloc(middle_max*sizeof(char)); // Please focus on this line
}

surnamedouble char pointersurname[i]是由i指向的surname指针是有道理的。

然而,middle_initial让我很困惑。中间initial[i]i个字符指针吗?如果是这样,为什么malloc会在调试期间为取消引用*(char *)而不是(char *)返回值调用?

**跟进问题**  我希望middle_initial [i]成为6个char指针,每个指针都有能力指向1个字符。我可以在上面修改什么来做到这一点?

1 个答案:

答案 0 :(得分:3)

有效取消引用“将类型的指针数减少一个”。

除了......之外,每一段代码都没问题。

middle_initial[i] = *(char*) malloc(middle_max*sizeof(char));

除了未定义的行为之外,该行应该做什么? 我们现在不!由于middle_initial的类型为char*,因此索引取消引用会有效地引用char对象。然后,我们有不合逻辑的表达。在堆上分配了char*middle_max个字符,但是...前面的*解除了分配内存的记忆(可以被整理的内存,BTW ......)。然后,将此类垃圾值分配给char中的前述middle_initial。这个循环的结果是一个middle_initial包含来自不可恢复的泄漏内存的垃圾字符。

当然,如果size < 5,UB在任何地方解除引用!