对字符串数组使用malloc

我想创建一个称为参数的字符串数组,该数组从称为单词的字符串数组中复制条目(从words [1]到末尾)。我在使用malloc时遇到了麻烦,并且我不太了解应该分配多少。 首先,我将要存储的所有字符加起来。单词中的最后一个条目始终为NULL。

words = ["jargon","hello","world",NULL];
int sum = 0;
for(int i = 1; words[i] != NULL; i++) {
    sum += strlen(words[i]);
}

因此,我在数组中将有和字符,称为自变量。所以现在我分配并复制所需的条目。

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]中使用了未初始化的值。谁能阐明正在发生的事情?

编辑:很抱歉样式不好,感谢您的建议。

chenglong502 回答:对字符串数组使用malloc

  

我想创建一个称为参数的字符串数组,该数组将复制   来自称为单词的字符串数组的条目

如果是这样,则此循环没有意义。

int sum = 0;
for(int i = 1; words[i] != NULL; i++) {
    sum += strlen(words[i]);
}

此外,C中的索引从0开始。目前尚不清楚为什么循环中的索引i1开始。

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

您需要的是以下

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] );
}

如果您要从复制的字符串集中排除字符串word [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] );
}
本文链接:https://www.f2er.com/3067243.html

大家都在问