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
}
surname
是double char pointer
,surname[i]
是由i
指向的surname
指针是有道理的。
然而,middle_initial让我很困惑。中间initial[i]
是i
个字符指针吗?如果是这样,为什么malloc
会在调试期间为取消引用*(char *)
而不是(char *)
返回值调用?
**跟进问题** 我希望middle_initial [i]成为6个char指针,每个指针都有能力指向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在任何地方解除引用!