c - 这个例子中的 char** 和 char* 有什么区别?

标签 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
}

surname 是一个 double char pointersurname[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/

相关文章:

c - 定义一个变量以在范围之外使用

c - c中数组内容不一致

c++ - 打印__float128,而不使用quadmath_snprintf

C - 使用指针的数组总和

c - 结构数组 : assignment from incompatible pointer type

子进程执行父代码(fork 之前的行)

c++ - 在执行函数指针时,使用地址运算符与不使用它的目的是什么?

pointers - Golang : help understanding pointers, 分配和意外行为

arrays - Swift 并行性 : Array vs UnsafeMutablePointer in GCD

c++ - 如何使用指针确保函数调用正确