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

これは、参照としてポインターへのポインターを取得する関数と関数の呼び出しがどのように見えるかだと思いますが、アイテム[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;
}

頭の中で作成した抽象化では、関数は問題ないはずですが、もちろん、セグメンテーション違反が発生しているとは限りません。ポインターへのポインターがどのようにうまく機能するかはすでに理解できましたが、ポインターへのポインターへのポインターの概念がどのようにコードに変換されるかについて頭を悩ませていると思います。

それで、私は何が欠けていますか?

4

2 に答える 2

1

逆参照を忘れて、*vs []. wrong の優先順位を得ました:

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 に答える