我知道关于在 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/