将字符一一分配给指针?

问题描述 投票:0回答:2

我想要一个由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];

此代码段错误。作业的右侧必须是地址吗?

c++ arrays pointers segmentation-fault c-strings
2个回答
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]为空,则pArr[i][j] = arr[j]通过空指针间接访问,并且程序的行为未定义。

而不是“代替”,所显示的摘录是完全有效的after,您已经初始化了指向足够大小的数组(的元素)的指针。给定示例中的初始化,所有指针均指向同一数组的同一元素。在同一阵列上重复相同的修改将毫无意义。


0
投票

您的代码中的问题(导致分段错误)是此行:

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]元素尚未分配值,因此此尝试失败。
© www.soinside.com 2019 - 2024. All rights reserved.