跳到主要内容

char **p, a[16][8]; 问:p=a是否会导致程序在以后出现问题?为什么 ?

参考答案:

在C语言中,char **p 声明了一个指向字符指针的指针,而 char a[16][8] 声明了一个二维字符数组。当你尝试将 a 的地址赋给 p,即 p = a,这在许多情况下是可以的,因为二维数组在内存中是连续的,并且它的地址可以作为一个指向其第一个元素的指针来使用。

然而,这种赋值可能会在未来导致问题,原因有以下几点:

  1. 类型不匹配p 是一个 char **,而 a 是一个 char (*)[8]。虽然它们在某些上下文中可以互换使用,但这种不匹配可能会导致编译器警告或错误,取决于具体的编译器和上下文。
  2. 语义混淆:即使这种赋值在语法上是合法的,它也可能导致代码阅读者的困惑。p 的类型表明它应该指向一个字符指针的数组,而不是一个二维字符数组。这种赋值可能会让其他开发者误解代码的真实意图。
  3. 动态内存分配:如果 p 随后被用于动态内存分配(例如,使用 mallocrealloc),那么这可能会导致问题,因为 a 是在栈上分配的,而动态分配的内存是在堆上。这两种内存区域有不同的生命周期和规则。
  4. 数组边界和长度p 作为 char ** 不包含任何关于 a 的行或列大小的信息。这可能导致在后续代码中访问数组时发生越界错误。

为了避免这些问题,最好明确你的意图,并相应地声明和使用变量。如果你确实需要一个指向二维字符数组的指针,应该使用 char (*p)[8] 这样的类型,这样 p 就可以明确地表示它是一个指向包含8个字符的数组的指针。