删除阵列与指针
dereferencing array vs pointer
我敢肯定这是以前问的,但是粗略的Google和stack Overflow搜索没有打开答案。
#include <stdio.h>
int main() {
char a[128][1024];
strcpy(a[0], "hello");
strcpy(a[1], "foo");
strcpy(a[2], "bar");
char **b = a;
printf("%sn", a[0]); //same as printf("%sn", a)
printf("%sn", a[2]+1); //print from 2nd char of 3rd string
printf("%sn", b); //same as printf("%sn", a), makes sense
printf("%sn", b[0]); //segfault???
}
首先,为什么最后一个是segfault?我期望与数组a
相同的行为。如何以广义方式从B访问n字符串?A和B之间的治疗差异是什么?
在类似的音符上,我理解的方式是a[n]
是*(a+n)
的句法糖。这是正确的,无论是指指针还是用于数组?然而,a
和b
的行为似乎不同。
谢谢!
char **b
说"在b
点b[0]
的地方,有一个指向char的指针。而且,如果我使用b[1]
,b[2]
,…,那也是char的指针。"
相反的char a[128][1024]
说:" a
是128个阵列1024 char。"当您这样做时,在a
所在的地方,没有指针。只有char。在内存中,它看起来像131,072 char(128•1024 = 131,072)。
分配char **b = a
时,假设编译器允许您将b
设置为a
的地址。当您使用b[0]
时,应该有一个指针。但是没有。那里只有char。当您将b[0]
传递给printf时,编译器将转到b
点的位置,将几个字节加载好像是指指针,并将结果值传递给Printf。然后printf崩溃,因为字节指向某些不良位置。
b
的适当定义是char (*b)[1024] = a;
。
这个
char **b = a;
是一种类型不匹配,因为a
是char[][]
,没有索引是char *
。
您可能想切换所有编译器警告(在gcc
上,这是通过-Wall
DOEN)。
这条线
printf("%sn", b[0]);
表示指向字符指针的指针,这是一个地址值。然后,它试图将地址值打印为(0端)字符串,最有可能访问随机内存的字符串。
相关文章:
- EIGEN地图类:将C阵列映射到VectorXD指针以有效的方式
- 通过从当地的C风格阵列中返回指针来获取一个悬空的指针
- 将C 中的每个指针删除作为阵列的指针安全吗?
- 重新分配指针阵列的一部分的安全方法
- 排序阵列会使指针链接错误
- 指针阵列在一个对象数组中函数
- 指针阵列打印值
- C 在指针阵列中删除第一个元素,以效应后来的元素
- 问题将信息复制到指针阵列中
- 从指针打印动态int阵列中获取怪异的字符
- 将指针或一系列指针存储在动态阵列中
- 删除指向排序的字符串阵列的指针会在运行后会有一个错误
- 排序浮动指针阵列
- 快速将双重指针阵列转换为单个指针,可能是连续的
- C 按顺序排列一个指针阵列
- 如何使用struct构造函数在结构中初始化指针阵列
- 带有超载运算符的指针阵列
- 指针阵列和指针数组的指针之间的区别
- 创建类型结构的指针阵列
- 指针阵列的动态初始化