将字符逐个分配给指针?



我想要一个由 10 个指向字符数组的指针组成的数组。为了简单起见,让它们都指向相同的字符数组。这是一种方法:

const int N = 10;
char arr[] = {'a', 'b', 'c', ''};
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];

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

编辑:我希望能够删除arr但不会丢失pArr中的数据。我想我只需要一个二维阵列。

但是,我可以不调用 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]为 null,则pArr[i][j] = arr[j]通过 null 指针间接进行,并且程序的行为未定义。

在您初始化指针以指向足够大小的数组(元素(后,显示的代码段不是"相反">而是完全有效。给定示例中的初始化,所有指针都指向同一数组的同一元素。在同一阵列上重复相同的修改是没有意义的。

代码中的问题(导致分段错误(是以下行:

pArr[i][j] = arr[j];

现在,您正确地假设,由于pArr是一个指针数组,因此您可以将其每个元素(即parr[i](用作"数组";但是,只有在为该元素赋值之后(即在所讨论的parr[i]元素获得有效地址之后(,您才能执行此操作。

因此,在执行第一个代码块后,每个pArr[i]值都将指向给定的数组,因此您可以使用pArr[i][j]来访问该数组的各个元素。

但是,在第二个块中,尝试为pArr[i][j]赋值会导致编译器(尝试(取消引用与每个pArr[i]对应的地址,并向其中添加j索引。但是尚未为pArr[i]元素分配值,因此此尝试失败。

我不完全确定您要实现的目标,但是,如果您希望pArr的每个元素都指向arr的"相应"字符元素,那么您可以使用这样的代码:

for (int i = 0; i < N; i++)
pArr[i] = &arr[i];

在这里你尝试做什么(三个不同表的例子(:

const int N = 10;
char arr1[] = {'a', 'b', 'c', ''};
char arr2[] = {'d', 'e', 'f','g', ''};
char arr3[] = {'h', 'i', ''};
char* pArr[N] ;
pArr[0] = (char*) calloc ( 1, sizeof(arr1));
pArr[1] = (char*) calloc ( 1, sizeof(arr2));
pArr[2] = (char*) calloc ( 1, sizeof(arr3));

for (int i = 0; i < sizeof(arr1); i++)
pArr[0][i] = arr1[i];
for (int i = 0; i < sizeof(arr2); i++)
pArr[1][i] = arr2[i];
for (int i = 0; i < sizeof(arr3); i++)
pArr[2][i] = arr3[i];

请注意,您需要为"pArr"分配内存,否则将出现分段错误

相关内容

  • 没有找到相关文章