无法填充动态c数组

时间:2011-04-02 20:21:56

标签: c arrays string

我在填充动态创建的字符串数组时遇到问题。该数组基本上包含两个字符串,我想用它们的长度打印它们。我得到一个非常奇怪的结果,因为内存位置混乱。请参阅下面的代码。

我们非常感谢任何建议。感谢。

void printWords(char **words, int numberOfWords)
{ 
    int index;

    for (index = 0; index < numberOfWords; index++)
    {
        printf("%s, %d\n", &(*words)[index], (int)strlen(&(*words)[index]));        
    }
}


void fillWords(char **words)
{
    *words = malloc(2 * sizeof(char *));

    char hello[] = {"Hello"};
    (*words)[0] = (char)malloc(strlen(hello) * sizeof(char));
    strcpy(&(*words)[0], hello); //Copy word into array 

    char world[] = {"Worldz"};
    (*words)[1] = (char)malloc(strlen(world) * sizeof(char));
    strcpy(&(*words)[1], world); //Copy word into array 
}


int main (int argc, const char * argv[])
{
    char *words;

    fillWords(&words);
    printWords(&words, 2);

    return 0;
}

预期输出应为

Hello, 5
Worldz, 6

然而我正在

HWorldz, 7
Worldz, 6

3 个答案:

答案 0 :(得分:1)

第一个问题:你不能在char * 中放两个单词(嗯......你可以,但不是你正在做的方式;而且这样做的方式与你的不一样)代码)

你需要一个“字符串数组”,或者更像C的数组char *

char *words[2]; /* words[0] and words[1] are pointers to char */
char *wrong;    /* wrong[0] is a char; wrong[1] is a char */

因此,更改主文件中words的定义,并检查/编辑所有其他功能是否正确。

int main (int argc, const char * argv[])
{
    char *words[2];

    fillWords(words);
    printWords(words, 2);

    return 0;
}

答案 1 :(得分:1)

我认为您在char *char **之间感到困惑。

此外,请确保为字符串末尾的空终止字符分配足够的内存。

这是我的解决方案:

#include <stdio.h>
#include <string.h>
#include <malloc.h>

void printWords(char **words, int numberOfWords)
{ 
    int index;

    for (index = 0; index < numberOfWords; index++)
    {
        printf("%s, %d\n", words[index], (int)strlen(words[index]));        
    }
}

char ** createWords()
{
    char ** words;

    // Allocate memory for an array of pointers, length 2.
    words = malloc(2 * sizeof(char *));

    char hello[] = {"Hello"};
    words[0] = malloc((strlen(hello)+1) * sizeof(char));
    strcpy(words[0], hello); //Copy word into array 

    char world[] = {"Worldz"};
    words[1] = malloc((strlen(world)+1) * sizeof(char));
    strcpy(words[1], world); //Copy word into array 

    return words;
}


int main (int argc, const char * argv[])
{
    char **words;

    words = createWords();
    printWords(words, 2);

    return 0;
}

我将fillWords重命名为createWords并使其返回指针而不是将指针作为参数。如果你真的希望fillWords将指针作为参数,你可以这样做,但参数必须是char ***类型。

答案 2 :(得分:0)

这是解决方案。我在char *和char之间感到困惑。我想要的是一系列字符。

void printWords(char **words, int numberOfWords)
{ 
    int index;

    for (index = 0; index < numberOfWords; index++)
    {
        printf("%s, %d\n", words[index], (int)strlen(words[index]));        
    }
}


void fillWords(char **words)
{
    *words = malloc(2 * sizeof(char *));

    char hello[] = {"Hello"};
    words[0] = malloc(strlen(hello) * sizeof(char));
    strcpy(words[0], hello); //Copy word into array 

    char world[] = {"Worldz"};
    words[1] = malloc(strlen(world) * sizeof(char));
    strcpy(words[1], world); //Copy word into array 
}


int main (int argc, const char * argv[])
{
    char *words;

    fillWords(&words);
    printWords(&words, 2);

    return 0;
}