对字符串数组使用malloc

对字符串数组使用malloc,c,pointers,malloc,c-strings,C,Pointers,Malloc,C Strings,我想创建一个名为arguments的字符串数组,它从一个名为words的字符串数组复制条目(从words[1]一直复制到末尾)。我和malloc之间有麻烦,我真的不明白我应该对malloc做多少。 我首先将要存储的所有字符相加。Word中的最后一个条目始终为空 words = ["jargon","hello", "world", NULL]; int sum = 0; for(int i = 1; words[i] != NULL; i++) { sum += strlen(words

我想创建一个名为arguments的字符串数组,它从一个名为words的字符串数组复制条目(从words[1]一直复制到末尾)。我和malloc之间有麻烦,我真的不明白我应该对malloc做多少。 我首先将要存储的所有字符相加。Word中的最后一个条目始终为空

words = ["jargon","hello", "world", NULL];
int sum = 0;
for(int i = 1; words[i] != NULL; i++) {
    sum += strlen(words[i]);
}
因此,我将在数组中使用名为arguments的和字符。因此,现在我使用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));
我通过了内存缓冲区溢出,但在下一行的参数[I]中遇到了一个未初始化的值。有人能解释一下发生了什么事吗

编辑:很抱歉款式不好,谢谢你的建议

我想创建一个名为arguments的字符串数组,用于复制 来自称为单词的字符串数组的条目

如果是这样,那么这个循环就没有意义了

int sum = 0;
for(int i = 1; words[i] != NULL; i++) {
    sum += strlen(words[i]);
}
此外,C中的索引从
0
开始。不清楚为什么you循环中的索引
i
1
开始

您需要分配一个指针数组,然后为指针数组元素将指向的字符串分配内存

您需要的是以下内容

size_t n = 0;

while ( words[n] != NULL ) ++n;

char **arguments = malloc( n * sizeof( *arguments ) );

for ( size_t i = 0; i != n; i++ )
{
    size_t length = strlen( words[i] );
    arguments[i] = malloc( length + 1 );
    strcpy( arguments[i], words[i] );
}
如果要从复制的字符串集中排除字符串字[0],则代码段可以如下所示

size_t n = 0;

while ( words[n+1] != NULL ) ++n;

char **arguments = malloc( n * sizeof( *arguments ) );

for ( size_t i = 0; i != n; i++ )
{
    size_t length = strlen( words[i+1] );
    arguments[i] = malloc( length + 1 );
    strcpy( arguments[i], words[i+1] );
}

什么是单词?请提供一份。。。最有可能的是
malloc(sum*sizeof(char))
->
malloc(sum*sizeof(char*))
for(int i=1;
@Jabberwocky:没有证据表明选择从
单词[1]开始获取数据
是一种风格选择,而不是功能选择。正如问题中所述,这是一种功能要求。具体而言,他们被赋予一个指针,所需的任务是从
单词[1]复制
on。当
main
的标准
argv
被传递到一个例程中,人们希望复制参数而不是程序名时,这种情况就会自然出现。@EricPostSchil这或多或少是在发生什么,但我找不到一种方法来很好地表达它。谢谢你为我找到了这些词。请不要只发布代码f或者是一个没有解释的答案。说明为什么为字符总数分配空间并将其分配给指向
char
的指针是错误的。说明为什么必须为指针分配空间。说明为什么必须为每个字符串分配空间。说明为什么必须为每个字符串添加一个。此外,我们不应该对cod建模这忽略了
malloc
返回null的可能性。学生应该尽快学会良好的错误处理和健壮的编程实践。@EricPostChil为什么不在这里开设教学课程?请不要认为我错了,我在这里提出了一个公平的观点。从
单词[1]开始
似乎是故意的,因为它在文本中明确说明,在代码中也有体现,包括从
单词[i]
复制到
参数[i-1]
。后者表明OP知道零基索引,并支持从
单词[1]开始的假设
是经过深思熟虑的。因此,暗示OP在这方面是错误的很可能是错误的。用它来开始答案而不是从代码中的关键问题开始是一种贬低。@EricPostDischil请发表你的详细文章,从二进制开始,包含一些小细节。很高兴向上投票。尽管没有必要,但给出了正确的解决方案关于索引的评论,所以投票。