繁体   English   中英

将 malloc 用于字符串数组

[英]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开始。 目前尚不清楚为什么循环中的索引i1开始。

您需要分配一个指针数组,然后为指针数组元素指向的字符串分配 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM