我想要一个由10个指针组成的数组,它们指向字符数组。为了简单起见,让它们全部指向同一字符数组。这是一种方法:
const int N = 10;
char arr[] = {'a', 'b', 'c', '\0'};
char *pArr[N] = {NULL};
for (int i = 0; i < N; i++)
pArr[i] = &arr[0];
而不是调用pArr[i] = &arr[0]
,我可以一一分配字符吗?类似的内容:
for (int i = 0; i < N; i++)
for (int j = 0; j < 3; j++)
pArr[i][j] = arr[j];
此代码段错误。作业的右侧必须是地址吗?
但是我可以不逐个分配字符,而不是调用pArr [i] =&arr [0]吗?类似于:
for (int i = 0; i < N; i++) { for (int j = 0; j < 3; j++) { pArr[i][j] = arr[j]; } }
如果pArr[i]
为空,则pArr[i][j] = arr[j]
通过空指针间接访问,并且程序的行为未定义。
而不是“代替”,所显示的摘录是完全有效的after,您已经初始化了指向足够大小的数组(的元素)的指针。给定示例中的初始化,所有指针均指向同一数组的同一元素。在同一阵列上重复相同的修改将毫无意义。
您的代码中的问题(导致分段错误)是此行:
pArr[i][j] = arr[j];
现在,假设pArr
是一个指针数组,可以将其每个元素(即parr[i]
)用作“数组”,这是正确的;但是,您可以only进行此操作[parr[i]
元素指定了有效地址之后)。
first代码块后,每个pArr[i]
值都将指向给定的数组,因此您可以使用pArr[i][j]
访问该数组的各个元素。
pArr[i][j]
分配值会导致编译器(尝试)取消引用与每个pArr[i]
对应的地址并添加j
索引。但是pArr[i]
元素尚未分配值,因此此尝试失败。