3

我一直在尝试通过引用将指向指针的指针(我们可以将其称为字符串数组或字符数组的数组)发送给函数,因为我需要更新它。我不想让函数将指针返回到指针(我正在工作的那个),因为我希望返回是数组的大小。

这是我为测试目的创建的一个工作函数,它返回指向指针的指针,以及调用方法:

#include <stdio.h>

char **populate_items() {
        char **items;
        int i;
        items = (char **) malloc(sizeof(char*) * 3);
        for (i=0; i<3; i++)
                *(items+i) = (char *) malloc(sizeof(char) * 10);
        items[0] = "1234567890";
        items[1] = "2345678901";
        items[2] = "3456789012";
        return items;
}

int main(int argv, char *argc) {
        char **items;
        int i;
        items = populate_items();
        for(i=0; i<3; i++)
                printf("%s\n", items[i]);
        return 0;
}

这就是我认为函数和获取指向指针作为引用的函数的调用应该看起来像,但是在尝试打印 items[1] 或 items[2] 时出现分段错误

#include <stdio.h>

populate_items(char ***items) {
        int i;
        *items = (char **) malloc(sizeof(char*) * 3);
        for (i=0; i<3; i++)
                *(items+i) = (char *) malloc(sizeof(char) * 10);
        *items[0] = "1234567890";
        *items[1] = "2345678901";
        *items[2] = "3456789012";
}

int main(int argv, char *argc) {
        char **items;
        int i;
        populate_items(&items);
        for(i=0; i<3; i++)
                printf("%s\n", items[i]);
        return 0;
}

在我脑海中创建的抽象中,该函数应该没问题,但当然不是因为我遇到了分段错误。我已经设法理解指向指针的指针如何工作得很好,但我认为我很难理解指向指针概念指针的指针如何转换为代码。

那么我错过了什么?

4

2 回答 2

1

您忘记了取消引用并获得了*vs.[]错误的优先级:

populate_items(char ***items) {
        int i;
        *items = (char **) malloc(sizeof(char*) * 3);
        for (i=0; i<3; i++)
                *(*items+i) = (char *) malloc(sizeof(char) * 10);
        (*items)[0] = "1234567890";
        (*items)[1] = "2345678901";
        (*items)[2] = "3456789012";
}

但请注意,作业

(*items)[0] = "1234567890";

等失去刚刚分配的内存的唯一句柄。

于 2013-01-04T01:59:04.190 回答
-1

你可以使用如下

 #include "stdafx.h"
 #include <stdlib.h>
 #include <stdio.h>


 char*** populate_items(char ***items) 
 {
      int i;
      items = (char ***) malloc(sizeof(char*) * 3);
      for (i=0; i<3; i++)
            *(items + i) = (char **) malloc(sizeof(char) * 10);
      **(items + 0) = "1234567890";
      **(items + 1) = "2345678901";
      **(items + 2) = "3456789012";
      return items;
 }

 int main(int argv, char *argc) 
 {
      char **items;
      int i;
      char *** res = populate_items(&items);
      for(i=0; i<3; i++)
            printf("%s\n", **(res + i));
      return 0;
 }
于 2013-01-04T09:23:26.983 回答