2

Cで動的配列を作成することについて複数の質問があることは知っていますが、それらは実際には役に立たなかったので、別の方法で質問させてください.

私のプログラムは、それぞれ可変長の可変数のコマンド ライン引数を読み込む必要があります。この関数は、main に渡された argv 配列を受け取り、環境設定である引数のみを含む char* の配列を返す必要があります。(プログラムは、UNIX の env コマンドを複製する必要があります。) これが今の私が持っているものです:

char** getEnvVariables(char* args[], int start) {
    int i = start;
    char** env_vars = (char **) malloc(1); 
    while (args[i]) {
        printf("size of env_vars: %d\n", sizeof(env_vars));
        if (isEnvironmentSetting(args[i])) {
            printf("arg: %s\n", args[i]);
            printf("size of arg: %d\n", sizeof(args[i]));
            printf("new size of env_vars: %d\n", (sizeof(env_vars) + sizeof(args[i])));

            env_vars = realloc(env_vars, (sizeof(env_vars) + sizeof(args[i])));
            memcpy(env_vars, args[i], sizeof(args[i]));
            i++;
        }
        else
            break;
    }

    return env_vars;
}

私の考えは、malloc() で配列を作成し、次に realloc() を使用して各 char* に必要なスペースを割り当て、memcpy() を使用して新しい char* を配列に追加することでした。しかし、配列は実際には成長していません。ループの各反復で、サイズは 8 バイトです。私はまだCと実践的なメモリ管理に非常に慣れていないので、助けていただければ幸いです。

4

3 に答える 3

1

sizeof(env_vars)ポインタが指す割り当てられたメモリのサイズではなく、常にポインタのサイズを返しますenv_varssizeofこのような目的で使用できるのは、静的に割り当てられた配列に対してのみです。

したがって、あなたの場合、配列サイズを保持する別の変数を維持する必要があります。

于 2012-09-21T06:21:06.767 に答える
1

次の方法で、メイン関数を指定する環境変数を取得できます。

int main(int argc, char *argv[], char *envp[])

envp 変数は argv と同様に環境変数を含みます。

于 2012-09-21T03:42:54.507 に答える
1

連結されたすべての文字列を指す (char ポインター) を返す場合を除き、入力 C 文字列を出力にコピーすることはできません。(char pointer) (または (char pointer pointer) ) の配列を返すには、新しい文字列を malloc してそのアドレスを env_vars に格納するか、env_vars に args[i] のアドレスを格納させる必要があります。両方のアプローチの実装を次に示します。

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

bool isEnvironmentSetting(const char * string)
{
   (void) string;
   return true;
}

char** getEnvVariables1(char* args[], int start) {
    int i = start;
    int num_args = 0;
    char** env_vars = NULL;
    char *string = NULL;
    printf("size of env_vars: %ld\n", num_args * sizeof(env_vars));
    while (args[i]) {
        if (isEnvironmentSetting(args[i])) {
            printf("arg: %s\n", args[i]);
            printf("size of arg: %ld\n", strlen(args[i]));
            num_args++;
            printf("new size of env_vars: %ld\n", num_args * sizeof(env_vars));
            env_vars = realloc( env_vars, sizeof(env_vars) * num_args );
            string = malloc(strlen(args[i]) + 1);
            strcpy(string,args[i]);
            env_vars[num_args - 1] = string;
            i++;
        }
        else
            break;
    }
    env_vars = realloc( env_vars, sizeof(env_vars) * (num_args + 1) );
    env_vars[num_args] = NULL;    
    return env_vars;
}

char** getEnvVariables2(char* args[], int start) {
    int i = start;
    int num_args = 0;
    char** env_vars = NULL;
    printf("size of env_vars: %ld\n", num_args * sizeof(env_vars));
    while (args[i]) {
        if (isEnvironmentSetting(args[i])) {
            printf("arg: %s\n", args[i]);
            printf("size of arg: %ld\n", strlen(args[i]));
            num_args++;
            printf("new size of env_vars: %ld\n", num_args * sizeof(env_vars));
            env_vars = realloc( env_vars, sizeof(env_vars) * num_args );
            env_vars[num_args - 1] = args[i];
            i++;
        }
        else
            break;
    }
    env_vars = realloc( env_vars, sizeof(env_vars) * (num_args + 1) );
    env_vars[num_args] = NULL;
    return env_vars;
}

int main(int argc, char *argv[])
{
   (void) argc;

   char **envVars = getEnvVariables1(argv,1);
   int i = 0;
   while (envVars[i] != NULL)
   {
      printf("env var: %s\n",envVars[i]);
      i++;
   }

   envVars = getEnvVariables2(argv,1);
   i = 0;
   while (envVars[i] != NULL)
   {
      printf("env var: %s\n",envVars[i]);
      i++;
   }

}
于 2012-09-21T05:30:08.103 に答える