массив указателей со строками, использующими malloc и буфер в C - PullRequest
0 голосов
/ 10 января 2012

Я застрял в том, как заполнить массив указателей строками, используя malloc.В отладке я вижу, что когда я заполняю 1-й указатель массива строкой, когда он собирается перейти к следующему указателю в массиве, он передает следующую строку в 1-м и 2-м элементе ... похоже, когда я использую ptr[i]=buff;PTR продолжает отображаться в массиве баффов.

    #include<stdlib.h>
    #include<string.h>
    #define size 2       //array of 2 pointers
    int main()
{
    int i;
    char *ptr[size];
    char buff[80];

    for (i=0;i<size;i++)
    {
        memset(buff, 0, sizeof(char) * 80);
        printf("Enter name:\n");fflush(stdout);
        scanf("%s",buff);

        ptr[i]=(char*)malloc(strlen(buff));
        //ptr[i]=buff;                        //that was the mistake
        strncpy(ptr[i], buff, strlen(buff));    //->correct answer!
        printf("length %d\n",strlen(buff));
    }
    for (i=0;i<size;i++)
    {
        printf("prt[%d]=%s\n",i,ptr[i]);fflush(stdout);
    }
    for (i=0;i<size;i++)
    {
        free(ptr[i]);
    }
    return 0;
}

Еще один странный вопрос, который у меня есть, касается длины массивов в целом.Когда массив объявлен, например, a[10], указатель a указывает на первый элемент массива.Что я не понимаю, это где хранится длина !?это предыдущий адрес памяти указателя а?Это раньше?Или это связано только с компилятором?Благодарю.Я надеюсь, что это было не слишком много, я спросил.:)

Ответы [ 2 ]

4 голосов
/ 10 января 2012

Это:

ptr[i]=buff;

не копирует строку. Он просто копирует указатель. Так что вы не вызвали утечку памяти (у вас нет возможности получить доступ к только что выделенной памяти), но это портит вашу программу, потому что ptr[i] теперь указывает на buff, поэтому каждый раз, когда вы читаете новую строку, будет влиять на все элементы ptr[].

Сделайте это вместо:

strncpy(ptr[i], buff, BUF_SIZE);

Обратите внимание, что использование gets считается плохой практикой; подумайте, что произойдет, если пользователь введет строку длиной более 9 символов.

1 голос
/ 10 января 2012

неверно следующее:

ptr[i]=buff

Вы должны использовать strcpy() вместо назначения.

В противном случае вы назначаете один и тот же указатель всем элементам ptr, теряете память malloc() ed и пытаетесь free() вещей, которых вы не malloc() ed.

...