webew
Войти » Регистрация
 
С/C++

Медленно схожу с ума, проблемы с выделением памяти для двумерного массива(

16 августа 2010, 2:35
Автор: fox
Вот код:
int main(void)
{
char **str;
int a=0;
int b=0;

str = (char **)malloc(128 * sizeof(char));

while(a<5)
{
printf("Enter String: ");
scanf("%s",(char *)(str+a));
a++;
}
while(b<5)
{
printf("%s \n",(char *)(str+b));
b++;
}

return 0;
}

А в ответ я получаю, смищение строк:
Цитата:

Enter String: fortero
Enter String: qwerty
Enter String: qwe
Enter String: fox
Enter String: fer
fortqwerqwe
qwerqwe
qwe
fox
fer

Явно строки:
fortqwerqwe
qwerqwe
перемешелись!
Перепробовал кучу комбинаций не одна не пошла, либо кара падает либо смищение(((
Спасибо за внимание!
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

rgbeast

Двумерный массив С не то же самое, что указатель на указатель. ** это массив из указателей. Вам нужно сначала выделить место под массив из char*, а затем в цикле выделить место под каждый подмассив char (str[0], str[1] и.т.д.).
16.08.2010, 04:50
Ответить
NO USERPIC

fox

А вы бы не могли бы пример показть, перед тем как уснуть я добился результата, но с char[10][128], а мне нужен глобальный масив который можно динамически изменять... При помощи malloc и free, если у вас есть пример буду очень признателен!
16.08.2010, 07:07
Ответить

deadka

Первое, что Вам следует сделать - это предельно внимательльно прочитать вот это:
http://citforum.ru/programming/c/h17.shtml

Код, который делает то, что вам нужно выглядит так:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    const int nSize=10;
    const int nSizeOfString=1024;
    int i;

    /* Выделим нужное количество памяти для размещения 10 указателей на char* */
    char** str = (char**)malloc(sizeof(char*)*nSize);

    /* на каждый указатель выделим строку (массив) из 1024 элементов */
    for (i=0; i<nSize; ++i)
    {
        str[i]=(char*)malloc(sizeof(char)*nSizeOfString);
    }

    /* Здесь могла быть ваша реклама, то есть делаем то, что хотим с этими строками: считаем с клавиатуры, выведем на экран */

    for (i=0; i<nSize; ++i)
    {
        printf("Enter String #%d: ",i+1);
        fgets(str[i],nSizeOfString,stdin);
    }

    for (i=0; i<nSize; ++i)
    {
        printf("%s",str[i]);
    }

    /* освободим память, выделенную под каждую строку */
    for (i=0; i<nSize; ++i)
    {
        free(str[i]);
    }

    /* освободим память, выделенную для  массива указателей */
    free(str);

    return 0;
}


Не используйте scanf - она опасна с точки зрения переполнения буфера, используйте, например, fgets.
Через more, через less мы бредем в страну чудес...
16.08.2010, 13:31
Ответить
NO USERPIC

fox

Спасибо огромное, нет правда спасибо нереально огромное!
Теперь у меня есть даже два варианта решения своей задачи, главное научиться...
Я бы сам-бы не додумался так круто, надо дважды выделять память... Спасибо!
16.08.2010, 14:22
Ответить
NO USERPIC

fox

Я так понимаю, вот эти параметры в вашем коде можно изменять в процессе программы, если вдруг массив должен изменять размер?
const int nSize=10;
const int nSizeOfString=1024;

Спасибо за внимание!
16.08.2010, 14:52
Ответить

deadka

Нет, эти два параметра (nSize и nSizeOfString) не могут изменить свое значение в процессе выполнения программы - обратите на ключевое слово const при объявлении этих переменных.
Через more, через less мы бредем в страну чудес...
16.08.2010, 14:55
Ответить
NO USERPIC

fox

Я заметил что это const, я думал... Ну вот подскажите мне как мне быть:
просто в моём случае извлекается из MySQL таблица, заведома я получаю число строк и макс длину строки, следовательно у меня есть параметры необходимые для границ двухмерного массива char, затем эти параметры отрабатывают, и программа снова вытягивает из тойже таблицы данные но их число может изменится на одну или более строку добавится, или наоборот уменьшится. Как я понимад malloc и free нужны для именно такого случая, или я снова в в чём-то ошибаюсь?
Спасибо за внимание!
16.08.2010, 15:01
Ответить
NO USERPIC

fox

Спасибо, что мне помогали, вот аналог того что я хочу, я изменил немного ваш код и работает так как в моей задачи нужно:
#include <stdio.h>
#include <stdlib.h>

char **str;
int x,y;

void fun_in(void);

void fun_out(void);

void fun_free(void);

int main()
{
int i,c;
printf("Enter num iteraciy: ");
scanf("%i",&c);

for(i=0;i<c;i++)
{

printf("Enter parameters Long String: ");
scanf("%i",&x);
printf("Enter parameters Kol-vo Strings: ");
scanf("%i",&y);

fun_in();

fun_out();

fun_free();
}

return 0;
}

void fun_in(void)
{
int i;
str=(char**)malloc(sizeof(char*)*y);

for(i=0;i<y;i++)
{
str[i]=(char*)malloc(sizeof(char)*x);
}

puts("##############*****ENTER***STRINGS******################");
printf("#################Enter %i String!!!###############\n",y);
for(i=0;i<y;i++)
{
printf("Enter %i String: ",(i+1));
scanf("%s",str[i]);
}
puts("##############*******FINISH***IN********################");

}

void fun_out()
{
int i;
puts("##############*****OUTOUT***STRINGS*****################");
for(i=0;i<y;i++)
{
printf("OutPutString: %s \n",str[i]);
}
puts("##############*********FINISH***********################");

}

void fun_free(void)
{
int i;
for(i-0;i<y;i++)
{
free(str[i]);
}

free(str);

}
 


Спасибо что уделили мне внимание! )))
16.08.2010, 16:50
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2024 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: