分配指向数组的指针数组

时间:2009-07-01 16:23:18

标签: c arrays pointers

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

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

感谢。

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

5 个答案:

答案 0 :(得分:3)

我在这里即兴创作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,所以你在这里得到第4个指针,指向字符串的NULL终止字符。

答案 1 :(得分:2)

char  chrArr[] = "asd";
char* ptrArr[strlen(chrArr)];

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

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

答案 2 :(得分:1)

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数组存在之前才有效(通常直到你退出语句块)。非常容易出错,但这正是您的要求。

答案 3 :(得分:0)

“如果我有一个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;
       }

   }
 }

希望它有所帮助。

答案 4 :(得分:0)

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;
}