对字符串数组使用malloc
我想创建一个名为arguments的字符串数组,它从一个名为words的字符串数组复制条目(从words[1]一直复制到末尾)。我和malloc之间有麻烦,我真的不明白我应该对malloc做多少。 我首先将要存储的所有字符相加。Word中的最后一个条目始终为空对字符串数组使用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
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请发表你的详细文章,从二进制开始,包含一些小细节。很高兴向上投票。尽管没有必要,但给出了正确的解决方案关于索引的评论,所以投票。