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

您可以通过以下方式获取指定主要功能的环境变量:

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

envp 变量喜欢 argv 并包含环境变量。

于 2012-09-21T03:42:54.507 回答
1

您不能将输入的 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 回答
1

sizeof(env_vars)将始终返回指针的大小,而不是指向的分配内存的大小env_vars。您sizeof只能将静态分配的数组用于此类目的。

因此,在您的情况下,您需要维护一个单独的变量来保存数组大小。

于 2012-09-21T06:21:06.767 回答