【发布时间】:2020-03-15 23:12:57
【问题描述】:
我想创建一个称为参数的字符串数组,它从称为单词的字符串数组中复制条目(从单词 [1] 到结尾)。我在使用 malloc 时遇到了问题,我真的不明白我应该使用多少 malloc。 我首先将要存储的所有字符加起来。 words 中的最后一个条目始终为 NULL。
words = ["jargon","hello", "world", NULL];
int sum = 0;
for(int i = 1; words[i] != NULL; i++) {
sum += strlen(words[i]);
}
所以我将在我的数组中包含称为参数的总和字符。所以现在我 malloc 并复制所需的条目。
char **arguments = malloc(sum * sizeof(char));
for(int i = 0; words[i] != NULL; i++) {
strcpy(arguments[i], words[i+1]);
}
但是,我得到了内存缓冲区溢出。如果我把它改成
char **arguments = malloc(sum * sizeof(*arguments));
我克服了内存缓冲区溢出,但在下一行的 arguments[i] 中收到了一个未初始化的值。有人能解释一下发生了什么吗?
编辑:对糟糕的风格感到抱歉,并感谢您的建议。
【问题讨论】:
-
什么是
words?请提供minimal reproducible example -
... 很可能是
malloc(sum * sizeof(char))->malloc(sum * sizeof(char*)) -
for(int i = 1;0 -
@Jabberwocky:没有证据表明选择从
words[1]开始的数据是一种风格而不是功能的选择。如问题所述,这是功能要求。具体来说,它们被给了一个指针,并且所需的任务是从words[1]开始复制。当main的标准argv传递给例程并且希望复制参数而不是程序名称时,就会自然而然地出现这种情况。 -
@EricPostpischil 这或多或少是发生了什么,但我找不到一种很好地表达它的方法。感谢您为我找到单词
标签: c pointers malloc c-strings