malloc
От: Idiot Россия  
Дата: 17.12.04 12:51
Оценка:
char **Words;
Words = (char **) malloc(sizeof(char)*Length);
if (Words==NULL) return -1;

Итак, вот я выделяю память, потом работаю с этим массивом, вроде бы не выходя за означенные границы выделенной памяти, но, тем не менее, все равно получается Access Violation. Вопрос: либо я неправильно проверяю то, выделилась ли память, либо что-то, о чем я не догадываюсь...
Re: malloc
От: _nn_  
Дата: 17.12.04 12:56
Оценка:
Здравствуйте, Idiot, Вы писали:

I>
I>char **Words;
I>Words = (char **) malloc(sizeof(char)*Length);
I>if (Words==NULL) return -1;
I>

I>Итак, вот я выделяю память, потом работаю с этим массивом, вроде бы не выходя за означенные границы выделенной памяти, но, тем не менее, все равно получается Access Violation. Вопрос: либо я неправильно проверяю то, выделилась ли память, либо что-то, о чем я не догадываюсь...

Вы используете указатель на указатель, а надо просто указатель
char* Words = (char*) malloc(Length * sizeof(char));
if(!Words)
 return -1;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: malloc
От: Phoenickx  
Дата: 17.12.04 13:00
Оценка:
Здравствуйте, Idiot, Вы писали:

I>
I>char **Words;
I>Words = (char **) malloc(sizeof(char)*Length);
I>if (Words==NULL) return -1;
I>

I>Итак, вот я выделяю память, потом работаю с этим массивом, вроде бы не выходя за означенные границы выделенной памяти, но, тем не менее, все равно получается Access Violation. Вопрос: либо я неправильно проверяю то, выделилась ли память, либо что-то, о чем я не догадываюсь...

Я слабо понимаю для чего могла понадобится конструкция **Words, но в этом случае нужно было по идее память не под char, а под ссылочный тип выделять (под char*),только не знаю как это реализовать
Re[2]: malloc
От: Phoenickx  
Дата: 17.12.04 13:03
Оценка:
Здравствуйте, _nn_, Вы писали:


__>Вы используете указатель на указатель, а надо просто указатель

__>
__>char* Words = (char*) malloc(Length * sizeof(char));
__>if(!Words)
__> return -1;
__>


А если бы стояла задача создать указатель на указатель (например массив указателей)?Как тогда память выделять?
Re[2]: malloc
От: Аноним  
Дата: 17.12.04 13:13
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, Idiot, Вы писали:


I>>
I>>char **Words;
I>>Words = (char **) malloc(sizeof(char)*Length);
I>>if (Words==NULL) return -1;
I>>

I>>Итак, вот я выделяю память, потом работаю с этим массивом, вроде бы не выходя за означенные границы выделенной памяти, но, тем не менее, все равно получается Access Violation. Вопрос: либо я неправильно проверяю то, выделилась ли память, либо что-то, о чем я не догадываюсь...

__>Вы используете указатель на указатель, а надо просто указатель

__>
__>char* Words = (char*) malloc(Length * sizeof(char));
__>if(!Words)
__> return -1;
__>


Ну да, прошу прощения, забыл сказать, что работаю я с Words как с двумерным массивом...
Re[3]: malloc
От: _nn_  
Дата: 17.12.04 13:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, _nn_, Вы писали:


__>>Здравствуйте, Idiot, Вы писали:


I>>>
I>>>char **Words;
I>>>Words = (char **) malloc(sizeof(char)*Length);
I>>>if (Words==NULL) return -1;
I>>>

I>>>Итак, вот я выделяю память, потом работаю с этим массивом, вроде бы не выходя за означенные границы выделенной памяти, но, тем не менее, все равно получается Access Violation. Вопрос: либо я неправильно проверяю то, выделилась ли память, либо что-то, о чем я не догадываюсь...

__>>Вы используете указатель на указатель, а надо просто указатель

__>>
__>>char* Words = (char*) malloc(Length * sizeof(char));
__>>if(!Words)
__>> return -1;
__>>


А>Ну да, прошу прощения, забыл сказать, что работаю я с Words как с двумерным массивом...


Ну тогда так :
char** Words = (char**) malloc(Length * sizeof(char*));
for(size_t i=0;i<Length;i++)
 Words[i] = (char*) malloc(Skolko_nado_dlia_vtoroy_razmernosti * sizeof(char));

// удаление
for(size_t i=0;i<Length;i++)
 free(Words[i]);
free(Words);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: malloc
От: Cory Россия  
Дата: 17.12.04 14:25
Оценка:
Здравствуйте, Phoenickx, Вы писали:

P>А если бы стояла задача создать указатель на указатель (например массив указателей)?Как тогда память выделять?


Вот примерно так:

char** Words = (char**) malloc(Length * sizeof(char*));

if(!Words)
 return -1;

for(int i=0;i<Length;i++)
{
 Words[i] = (char*)malloc(WordLength*sizeof(char));
 if(!Words[i])
  ...handle it somehow
}

... some logic


if(Words!=NULL)
{
 for(i=0;i<Length;i++)
 {
  if(Words[i]!=NULL)
   free(Words[i]);
   Words=NULL;
 }

 free(Words);
 Words=NULL;
}


А лучше стандартные контейнеры использовать .
Re[4]: malloc
От: Аноним  
Дата: 17.12.04 16:25
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, _nn_, Вы писали:


__>>>Здравствуйте, Idiot, Вы писали:


I>>>>
I>>>>char **Words;
I>>>>Words = (char **) malloc(sizeof(char)*Length);
I>>>>if (Words==NULL) return -1;
I>>>>

I>>>>Итак, вот я выделяю память, потом работаю с этим массивом, вроде бы не выходя за означенные границы выделенной памяти, но, тем не менее, все равно получается Access Violation. Вопрос: либо я неправильно проверяю то, выделилась ли память, либо что-то, о чем я не догадываюсь...

__>>>Вы используете указатель на указатель, а надо просто указатель

__>>>
__>>>char* Words = (char*) malloc(Length * sizeof(char));
__>>>if(!Words)
__>>> return -1;
__>>>


А>>Ну да, прошу прощения, забыл сказать, что работаю я с Words как с двумерным массивом...


__>Ну тогда так :

__>
__>char** Words = (char**) malloc(Length * sizeof(char*));
__>for(size_t i=0;i<Length;i++)
__> Words[i] = (char*) malloc(Skolko_nado_dlia_vtoroy_razmernosti * sizeof(char));

__>// удаление
__>for(size_t i=0;i<Length;i++)
__> free(Words[i]);
__>free(Words);
__>


Можно вопрос? По идее, все равно ведь выделяется одинаковое количество памяти, мы в ее пределах работаем, какая разница, как выделять?
Re[5]: malloc
От: _nn_  
Дата: 17.12.04 17:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Можно вопрос? По идее, все равно ведь выделяется одинаковое количество памяти, мы в ее пределах работаем, какая разница, как выделять?


Здесь ведь все в том для чего мы выделем память

// выделяем место для первой размерности массива - выделяем место для указателей
char** Words = (char**) malloc(Length * sizeof(char*));
// выделяем место для данных
for(size_t i=0;i<Length;i++)
 Words[i] = (char*) malloc(Skolko_nado_dlia_vtoroy_razmernosti * sizeof(char));

// освобождение место для данных
for(size_t i=0;i<Length;i++)
 free(Words[i]);
// освобождение места указателей
free(Words);


Так как здесь идет двухмерный массив то надо выделить место для первой размерности, а потом место для второй, но первая размерность это указатель на вторую.

P.S.
Надеюсь понял правильно вас.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.