在 C 中创建动态字符串数组

标签 c malloc memcpy realloc

我知道关于在 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 和实际内存管理仍然很陌生,因此非常感谢任何帮助。

最佳答案

您不能将输入 C 字符串复制到输出,除非您想 返回一个指向所有连接在一起的字符串的(字符指针)。 要返回 (charpointer) (或 (charpointerpointer) )数组,您需要 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++;
   }

}

关于在 C 中创建动态字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12523840/

相关文章:

c - 在非结构或 union 中请求成员 's'

c - 如何将二维数组复制到临时二维数组中并返回它?

java - 在执行 mmap 时,C 或 Java 会有明显的性能差异吗?

无法通过教程草图将数据从arduino mega上传到Cosm

objective-c - C代码使用random的解释

c++ - 重写 operator new 时编译器错误

c - 固定大小类型的动态分配

c - 在动态分配的结构(数组结构)中分配动态数组

c++ - 在没有 CRT、memcpy 和 memset 内部函数的情况下构建时出现链接错误

c - memcpy() 不会停止复制