0

main でポインターの配列を変更する方法は知っていますが、関数で変更する必要がある場合に行う方法がわかりません。** の間のコードは、関数を使用せずにメインで行う方法です。ポインターのポインターの配列を出力する方法を知っています。私の質問は、これらの行 ** を function() に移動したいとします。何を変更する必要がありますか?

コード:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void function(char *array[], int size);
void function_print(char *array[], int size);
int main()
{
    char *array[] = {0};

    char word[20];

    **scanf("%s", word);
    int len = strlen(word) + 1;
    array[size] = (char *)malloc(sizeof(len));          
    strlcpy(array[size], word, sizeof(array[size]));**


    function(array, 0);

    return 0;
}

void function(char *array[], int size)
{

}

void function_print(char *array[], int size)
{
   for(int x = 0; x < size; x ++)
   {
       printf("%s", *array);
       (array)++;
   }
}


~
~
4

4 に答える 4

1

私はいくつかの編集を行い、あなたの機能が同じことをすることに気付きました。それで、続けて、それがどのように機能するかわからない場合は、編集を読んでください。

それに、あなたの main() に何か問題があると思います。まず、array[size] = (char *)malloc(sizeof(len)); ここではサイズが定義されていないため、エラーが報告される傾向があります。第 2 に、サイズが配列内の要素の数を意味する場合、array[size] はオーバーフローを引き起こします。第 3 に、malloc の引数は、sizeof(len) ではなく sizeof(char)*len にする必要があります。後者は sizeof(int) に等しいからです。

関数を次のように変更します

void function(char **, int);

そしてそれを

function(array, 0);

編集

「変更する」とは、配列に格納されているポインターを変更することを意味すると思います。すべての要素は aであるためchar*、 achar**は仕事をします。

引数として渡す場合array、実際には最初の要素のアドレスを渡しています。次に、関数でそれを受け取りますchar** parray。サイズも渡したので、 として使用できchar* parray[]、すべての要素のアドレスは in とまったく同じarrayですmain()。したがって、変更を加えるparrayと変更されarrayます。それはあなたが望むものですか?

于 2013-07-12T01:51:51.113 に答える
0

これを書く:

void function(char *array[], int size)

この:

void function(char **array, int size)

この文脈では同じです。

このような関数を定義する場合、同じように宣言する必要はありません。次のように宣言できます。 void function(char **, int );

宣言は、関数の戻り値の型と引数の型のみを記述します。その他の推奨事項:

scanf次のように使用しないでください。

scanf("%s", word);// you need to specify field width in case of strings otherwise it will overwrite buffer in case of large stringsしたがって、次のようにします。

scanf("%19s",word);

sizeあなたのメインでは定義されていません。代わりに、私はむしろこの方法を好むでしょう:

size_t len = sizeof(word) + 1;// yes, try to use size_t when returning number of bytes 
    *array = (char*)malloc(sizeof len);// casting malloc is not recommended though. 
    strncpy(*array, word,len);
于 2013-07-12T03:46:53.273 に答える
-2

やってみてください:

void function(char *array, int size)();

そして代わりに:

function(array,0);

配列自体がmemroyアドレスであるためです。

于 2013-07-12T02:05:32.637 に答える