【问题标题】:Assign array of pointers to array将指针数组分配给数组
【发布时间】:2009-07-01 16:23:18
【问题描述】:

如果我有一个 char 指针数组和另一个静态字符数组,如何将指针数组的每个元素分配给静态数组的每个元素?

(试图将问题分解为更小的问题。)

谢谢。

   array of pointers                            array of char
    +----+                                           +----+                        
    |    |       ---->                               |    |
    | *  |                                           |  h |
    +----+                                           +----+
    | *  |                                           | i  |
    |    |         ---->                             |    |
    +----+                                           +----+

【问题讨论】:

  • 你想复制一个 char *[] 到一个 char[][] 吗?
  • 基于语法不确定,请看我漂亮的 ASCI 艺术 =)
  • 你在做作业吗?

标签: c arrays pointers


【解决方案1】:

我在这里即兴创作了 Tomi 的答案。
其他人太长了,无法回答这样的问题。

char  chrArr[] = "asd";
char* ptrArr[sizeof(chrArr)];
int i;

// A simple assignment loop over 'i' pointers and chars
for (i=0; i< sizeof(chrArr); i++)
    ptrArr[i] = &chrArr[i];
    ---------   ----------
//  pointer =   address of character

因为我使用了sizeof,所以这里有第四个指针,它指向字符串的 NULL 终止字符。

【讨论】:

  • 不错,但不能在 C 中创建可变大小的数组 - 将 ptrArr 的定义更改为:char* ptrArr[3];
  • 你说得对,我把 strlen 和 sizeof 搞混了……事实上,我把它读作 sizeof,因为这样会起作用(这是我经常看到人们在代码中犯的那种错误评论)。现在修复它
  • 或者你可以 malloc 它,如果他试图在数据结构中使用它。
  • @Hooked,我认为真正的答案是最后一行的作业。其他的只是为了上下文......这就是我犯第一个错误的原因。
【解决方案2】:
char  chrArr[] = "asd";
char* ptrArr[strlen(chrArr)];

char*  chrPtr = chrArr;
char** ptrPtr = ptrArr;

while (*chrPtr)
    *ptrPtr++ = chrPtr++;

【讨论】:

    【解决方案3】:

    Aditya 重新提交了您的答案。我不确定你为什么分配所有的指针。 "如果我有一个 char 指针数组"

    char** arr;
    

    "和另一个静态字符数组"

    char str[]="Hi there";
    

    "如何将指针数组的每个元素分配给静态数组的每个元素?"

    len = strlen(str);
    arr = (char **) malloc(sizeof(char *) * len); /*typecasting for C++ */
    if ( arr != NULL )
    {
      int i=0;
      for(i=0; i < len; i++)
         arr[i]=&str[i];
    } else {
       // error handling
    }
    

    当然,这些指针仅在静态 str 数组存在之前有效(通常在您退出语句块之前)。很容易出错,但这正是您的要求。

    【讨论】:

    • OP 想要“将指针数组的每个元素分配给静态数组的每个元素?”.....静态数组的每个元素不是 char 而不是 char *。这就是我在每个元素的循环中 malloc 的原因。
    【解决方案4】:

    "如果我有一个 char 指针数组"

    char** arr;

    "和另一个静态字符数组"

    char str[]="你好"

    "如何将指针数组的每个元素分配给静态数组的每个元素?"

    len = strlen(str);
    arr = (char **)malloc(sizeof(char *) * len);/*typecasting for C++ */
     if ( arr != NULL)
     {
       for(i=0; i < len; i++)
       {
         arr[i] = (char *)malloc(sizeof (char)); /* typecasting for C++ */
         if ( arr[i] != NULL)
           {
            arr[i] = &str[i];
            }
         else
           {
             /*If you choose to return from here,
              * free allocated memory upto now 
              */
             for(j=0;j<i;j++)
               {
                 free(arr[j]);
               }
             free(arr);
             return 1;
           }
    
       }
     }
    

    希望对你有帮助。

    【讨论】:

    • 这太长了,它释放内存的方式是完全错误的。你正在从堆中取出东西,所以它有随机垃圾,然后你试图释放它们?
    • 太长了,我同意。你能解释一下为什么释放内存是完全错误的吗?
    • mallocing = 请求借用字节。内存管理器为您提供堆中的字节。这些字节之前可能已经使用过,因此它们具有随机值(为了论证)。当您遍历它时,您将提取 4 个字节的部分(所有这些部分都是随机的),然后尝试释放它(请记住,甚至还没有分配空间)。相反,你应该 free(arr);
    • "arr = (char **)malloc(sizeof(char *) * len);"...这不是分配内存。只有当其中一个内部 malloc 失败时,我才会释放。因此,如果 malloc 在 i=3 时失败,则 i 释放之前分配的 0,1,2。
    【解决方案5】:
    char **getPointers(char *initArr) {
    char **arr;
    int len, i;
    
    if(initArr == NULL) return NULL;
    
    /* + 1 for the null terminator */
    len = strlen(initArr) + 1;
    
    arr = (char **) malloc(sizeof(char *) * len);
    
    /* since initArr is an array, we know the characters are contiguous in memory,
        so let's trust pointer arithmetic instead of dereferencing references we 
        create */
    for(i = 0; i < len; i++) arr[i] = initArr + i;
    
    return initArr;
    }
    

    【讨论】:

    • "如何将指针数组的每个元素分配给静态数组的每个元素?".....静态数组的每个元素不是一个 char 而不是一个 char *。
    猜你喜欢
    • 1970-01-01
    • 2014-11-23
    • 2018-10-06
    • 1970-01-01
    • 2011-04-02
    • 2019-05-18
    • 2021-11-29
    • 2015-07-05
    • 2013-07-01
    相关资源
    最近更新 更多