Проблемы с заполнением динамического массива c - PullRequest
0 голосов
/ 03 апреля 2011

У меня проблемы с заполнением массива строк, который был создан динамически.Массив в основном содержит две строки, и я хотел бы напечатать их обе с их длинами.Я получаю очень странный результат, в результате чего места в памяти перепутаны.Пожалуйста, смотрите код ниже.

Любые предложения будут с благодарностью.Спасибо.

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 ]

1 голос
/ 03 апреля 2011

Я думаю, вы запутались между 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 ***.

1 голос
/ 03 апреля 2011

Первая проблема: вы не можете поместить 2 слова в 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;
}
0 голосов
/ 03 апреля 2011

Вот решение.Я запутался между 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...