通过引用发送指针指针

时间:2013-01-04 01:56:03

标签: c

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

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

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

这是我认为函数和函数的调用,它获取指针作为引用的指针应该看起来像,但我在尝试打印项目[1]或项目[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;
}

在我脑海中创建的抽象中,函数应该没问题,但是当然没有给出我的分段错误。我已经设法理解指向指针的指针是如何正常工作的,但我认为我无法理解指向指针概念的指针如何转换为代码。

那么我错过了什么?

2 个答案:

答案 0 :(得分:1)

您忘记了取消引用,并且*[]的优先顺序错误:

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

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

答案 1 :(得分:-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;
 }