[英]Using malloc for an array of strings
我想创建一个名为 arguments 的字符串数组,它从名为 word 的字符串数组中复制条目(从 words[1] 到结尾)。 我在使用 malloc 时遇到问题,我真的不明白 malloc 应该多少钱。 我首先将要存储的所有字符加起来。 单词中的最后一个条目始终是 NULL。
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]);
}
但是,我得到一个 memory 缓冲区溢出。 如果我将其更改为
char **arguments = malloc(sum * sizeof(*arguments));
我通过了 memory 缓冲区溢出,但在下一行的 arguments[i] 中看到了一个未初始化的值。 任何人都可以对发生的事情有所了解吗?
编辑:对糟糕的风格感到抱歉,并感谢您的建议。
我想创建一个名为 arguments 的字符串数组,它从名为 word 的字符串数组中复制条目
如果是这样,那么这个循环没有意义。
int sum = 0;
for(int i = 1; words[i] != NULL; i++) {
sum += strlen(words[i]);
}
此外 C 中的索引从0
开始。 目前尚不清楚为什么循环中的索引i
从1
开始。
您需要分配一个指针数组,然后为指针数组元素指向的字符串分配 memory。
您需要的是以下内容
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] );
}
如果要从复制的字符串集中排除字符串 words[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] );
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.