【发布时间】:2010-09-30 22:04:42
【问题描述】:
我认为我没有正确理解如何为我想做的事情分配内存。
我希望我的程序将命令行中的参数存储到一个名为 Command 的结构数组中,其中包含 char **args。例如,如果我运行
./test.c echo hello : ls -l
我希望它像这样存储它
commands[0].args[0]= echo
commands[0].args[1]= hello
commands[1].args[0]= ls
commands[1].args[1]= -l
但是我的代码是以这种方式存储它
commands[0].args[0]= echo
commands[0].args[1]= hello
commands[0].args[2]= ls
commands[0].args[3]= -l
commands[1].args[0]= ls
commands[1].args[1]= -l
有人可以帮我理解为什么将 ls -l 存储在 2 个地方吗?这是我的代码:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
typedef struct test {
char **args;
} Command;
int main(int argc, char *argv[])
{
int i, j, k;
Command *commands;
j = k = 0;
commands = (Command *)malloc(argc * sizeof(Command));
for (i = 1; i < argc; i++)
{
if (strcmp(argv[i], ":") == 0)
{
j++;
k = 0;
}
else {
commands[j].args = (char **)realloc(commands[j].args, (k+1) * sizeof(char*));
commands[j].args[k++] = argv[i];
}
}
for (i = 0; i <= j; i++)
{
for (k = 0; k < 5; k++)
{
printf("commands[%d].args[%d]= %s\n", i, k, commands[i].args[k]);
}
}
return EXIT_SUCCESS;
}
【问题讨论】:
-
for (k = 0; k < 5; k++)是未定义的行为 -
您不能
realloc之前未分配的东西(或设置为 NULL)。但这就是你为commands[j].args所做的事情。 -
我发现 commands[0].args[2] 和 commands[1].args[0] 是同一个地址...我该如何解决/更改这个?
-
commands[0].args[2] 从未在您的初始代码中分配。幸运的是,commands[1] 的空间是在 commands[0] 之后立即分配的。所以,当你试图超越 commands[0].args 的范围时,你碰巧打印出了 commands[1].args[0]。这是未定义的行为!问题是您正试图查看一个不存在的数组成员 commands[0].args[2]。使用以下建议将您的 for 循环打印限制为每个命令的实际长度。
标签: c memory-management