【问题标题】:Assigning characters one-by-one to a pointer?将字符一个接一个地分配给指针?
【发布时间】:2020-05-15 02:17:37
【问题描述】:

我想要一个由 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] = &amp;arr[0]我可以一个一个地分配字符吗?类似于:

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

除了这个代码段错误。作业的右侧是否必须是地址?

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

【问题讨论】:

  • “我想要一个数组,比如说,10 个指向字符数组的指针”确定吗?为什么不是std::vector&lt;std::string&gt;?它以更少的麻烦实现了相同(甚至更多)
  • 如果使用 C++,为什么要使用 c-pointer 样式?
  • 你是 pArr[i][j],但 p[i] 是 NULL。
  • 你想在这里访问什么pArr[i][j]
  • 你真正想要实现什么?为什么你认为你需要一个指向 char 的 c 数组的指针数组?

标签: c++ arrays pointers segmentation-fault c-strings


【解决方案1】:

但不是调用 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] 通过空指针间接访问,程序的行为未定义。

而不是“相反”,显示的 sn-p 您已初始化指针以指向足够大小的数组(元素)之后是完全有效的。给定示例中的初始化,所有指针都指向同一数组的同一元素。对同一个数组重复同样的修改是没有意义的。

【讨论】:

    【解决方案2】:

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

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

    现在,您的假设是正确的,因为pArr 是一个指针数组,您可以将其每个元素(即parr[i])用作“数组”;但是,您只能在为该元素分配值之后执行此操作(即,在相关parr[i] 元素被赋予有效地址之后)。 p>

    因此,在您的 first 代码块执行后,每个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];
    

    【讨论】:

      【解决方案3】:

      这是您尝试做的事情(以 THREE 不同表为例):

      const int N = 10;
      
      char arr1[] = {'a', 'b', 'c', '\0'};
      char arr2[] = {'d', 'e', 'f','g', '\0'};
      char arr3[] = {'h', 'i', '\0'};
      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”分配内存,否则会出现分段错误

      【讨论】:

        猜你喜欢
        • 2011-03-19
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多