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
指向的第 th 个指针。
但是,middle_initial 让我感到困惑。中间的 initial[i]
是第 i
字符指针吗?如果是这样,为什么 malloc
在调试期间返回对取消引用的 *(char *)
而不是 (char *)
的值调用?
** 跟进问题** 我希望 middle_initial [i] 是 6 个字符指针,每个指针都有指向 1 个字符的能力。我可以在上面修改什么来做到这一点?
最佳答案
取消引用有效地“将类型的指针计数减少了一个”。
那里的每段代码都可以,除了...
middle_initial[i] = *(char*) malloc(middle_max*sizeof(char));
除了未定义的行为之外,这条线应该做什么? 我们现在不!作为 middle_initial
的类型是char*
, 通过索引取消引用有效地引用了 char
目的。然后,我们有不合逻辑的表达。 char*
的 middle_max
chars 分配在堆上,但是... *
在前面取消引用分配的内存(可以初始化的内存,顺便说一句......)。然后,将这样一个垃圾值赋值给前面提到的char
。在middle_initial
.这个循环的结果是 middle_initial
包含来自不可恢复的泄漏内存的垃圾字符。
当然,如果 size < 5
, 每当取消引用时,UB 无处不在!
关于c - 这个例子中的 char** 和 char* 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32218784/