开发者

Trouble filling a dynamic c array

I am having issues with filling an array of strings that was created dynamically. The array basically contains two strings and I would like to print them both with their lengths. I am getting a very weird result whereby the memory locations are getting mixed up. Please see the code below.

Any suggestions would greatly be appreciated. Thanks.

void pr开发者_运维百科intWords(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;
}

The expected output should be

Hello, 5
Worldz, 6

however I am getting

HWorldz, 7
Worldz, 6


I think you are getting confused between char * and char **.

Also, be sure to allocate enough memory for the null-termination character at the end of the string.

Here is my solution:

#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;
}

I renamed fillWords to createWords and made it return a pointer instead of taking a pointer as an argument. If you really want fillWords to take a pointer as an argument, you can do it, but the argument will have to be of type char ***.


First problem: you can't put 2 words in a char * (well ... you can, but not the way you're doing; and the way to do it is nothing like your code).

You need an "array of strings", or, more C-like, an array of 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 */

So, change the definition of words in your main and check/edit all the other functions for correctness.

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

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

    return 0;
}


Here is the solution. I was getting confused between char* and char. What I want was an array of chars.

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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜