realloc, не работающий на 2-й массив указателей

В следующем коде я прошу, чтобы пользователь дал мне некоторые последовательности. Я делаю 2-й массив символов указателя, так, чтобы я прочитал вход с последовательностью указателя, которая указывает на начало последовательности длины 50. Моя проблема состоит в том, что я продолжаю терпеть крах после входа первой последовательности.. и я предполагаю, что моя проблема имеет отношение к realloc. Я не привык к нему.. можно ли, пожалуйста, помочь выяснить то, что происходит?? Я пытался отладить с netbeans, но не сумел видеть что-либо интересное, так как это не дает обратную связь для новых адресов, сделанных из realloc!!

Вот код:

#include
#include
#include

int main()
{
    char *str,**string,buffer[50],temp[2];
    int i,j,q,size,counter;
    size=10;
    string=(char**) calloc(size,sizeof(char*));
    for (i=0; i

Я хочу сделать стол указателей больше с этим realloc.

0
добавлено отредактировано
Просмотры: 2
Пожалуйста, избегайте , получает .
добавлено автор md5, источник
Пожалуйста, избегайте , получает .
добавлено автор md5, источник
но я don' t хотят сделать последовательность больше.. Я хочу сделать стол последовательностей больше!
добавлено автор alex777, источник
1) Да я знаю о, добирается.. haven' t попробовал fgets все же. Я скоро буду. 2) Да жаль о unsused переменных.. это не весь код!!!!!!! 3), Какова проблема с одной линией для петли?
добавлено автор alex777, источник
1) Да я знаю о, добирается.. haven' t попробовал fgets все же. Я скоро буду. 2) Да жаль о unsused переменных.. это не весь код!!!!!!! 3), Какова проблема с одной линией для петли?
добавлено автор alex777, источник
1) Да я знаю о, добирается.. haven' t попробовал fgets все же. Я скоро буду. 2) Да жаль о unsused переменных.. это не весь код!!!!!!! 3), Какова проблема с одной линией для петли?
добавлено автор alex777, источник
1) Да я знаю о, добирается.. haven' t попробовал fgets все же. Я скоро буду. 2) Да жаль о unsused переменных.. это не весь код!!!!!!! 3), Какова проблема с одной линией для петли?
добавлено автор alex777, источник
@alex777: Выезд sscce.org. Сокращение вашего примера к минимальному примеру показывает любезность людям, к которым вы обращаетесь за помощью, обучает вашу отладку / программирование навыков, и имеет большое значение для нахождения ваших ошибок сами.
добавлено автор DevSolar, источник
Я прекратил пытаться выяснить код после солнце() / str / буфер / j / q (неиспользованный) и короткое для петля. There' s только до сих пор я пойду, чтобы помочь кому-то, и пример кода такого низкого качества - пустая трата времени.
добавлено автор DevSolar, источник
Я прекратил пытаться выяснить код после солнце() / str / буфер / j / q (неиспользованный) и короткое для петля. There' s только до сих пор я пойду, чтобы помочь кому-то, и пример кода такого низкого качества - пустая трата времени.
добавлено автор DevSolar, источник
Я прекратил пытаться выяснить код после солнце() / str / буфер / j / q (неиспользованный) и короткое для петля. There' s только до сих пор я пойду, чтобы помочь кому-то, и пример кода такого низкого качества - пустая трата времени.
добавлено автор DevSolar, источник
Я прекратил пытаться выяснить код после солнце() / str / буфер / j / q (неиспользованный) и короткое для петля. There' s только до сих пор я пойду, чтобы помочь кому-то, и пример кода такого низкого качества - пустая трата времени.
добавлено автор DevSolar, источник
@alex777: Выезд sscce.org. Сокращение вашего примера к минимальному примеру показывает любезность людям, к которым вы обращаетесь за помощью, обучает вашу отладку / программирование навыков, и имеет большое значение для нахождения ваших ошибок сами.
добавлено автор DevSolar, источник
@alex777: Выезд sscce.org. Сокращение вашего примера к минимальному примеру показывает любезность людям, к которым вы обращаетесь за помощью, обучает вашу отладку / программирование навыков, и имеет большое значение для нахождения ваших ошибок сами.
добавлено автор DevSolar, источник
@alex777: Выезд sscce.org. Сокращение вашего примера к минимальному примеру показывает любезность людям, к которым вы обращаетесь за помощью, обучает вашу отладку / программирование навыков, и имеет большое значение для нахождения ваших ошибок сами.
добавлено автор DevSolar, источник
О, хорошо можете вы редактировать свой вопрос ясно дать понять.
добавлено автор sean, источник
О, хорошо можете вы редактировать свой вопрос ясно дать понять.
добавлено автор sean, источник
О, хорошо можете вы редактировать свой вопрос ясно дать понять.
добавлено автор sean, источник
последовательности [я] = realloc (последовательности [я], размер * sizeof (случайная работа));
добавлено автор sean, источник
О, хорошо можете вы редактировать свой вопрос ясно дать понять.
добавлено автор sean, источник
последовательности [я] = realloc (последовательности [я], размер * sizeof (случайная работа));
добавлено автор sean, источник

10 ответы

    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;

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

Кроме того, тот size=0; полностью сломан.

4
добавлено
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;

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

Кроме того, тот size=0; полностью сломан.

4
добавлено

realloc не инициализирует ассигнованную память с нолями, кроме того вы забыли инициализировать недавно ассигнованные указатели строк.

Рассмотрите, чтобы переместить вверх меня ++ и размер ++ в цикле с условием продолжения.

2
добавлено

realloc не инициализирует ассигнованную память с нолями, кроме того вы забыли инициализировать недавно ассигнованные указатели строк.

Рассмотрите, чтобы переместить вверх меня ++ и размер ++ в цикле с условием продолжения.

2
добавлено

realloc не инициализирует ассигнованную память с нолями, кроме того вы забыли инициализировать недавно ассигнованные указатели строк.

Рассмотрите, чтобы переместить вверх меня ++ и размер ++ в цикле с условием продолжения.

2
добавлено

realloc не инициализирует ассигнованную память с нолями, кроме того вы забыли инициализировать недавно ассигнованные указатели строк.

Рассмотрите, чтобы переместить вверх меня ++ и размер ++ в цикле с условием продолжения.

2
добавлено

Code Review

инициализируйте все свои переменные

  char *str = NULL,**string = NULL,buffer[50] = {0},temp[2] = {0};
  int i = 0,j = 0,q = 0,size = 10,counter = 0;

не бросайте то, что возвращено из malloc/calloc , и используйте {}, если это возможно, для ясности

string=calloc(size,sizeof(char*));
for (i=0; i

Когда чтение с клавиатуры не использует , получает , используйте fgets() , так как можно определить макс. размер, чтобы читать.

printf("\nGimme strings, terminate input with x");
char input[256];
fgets(input,sizeof(input),stdin);//another varname, will explain below

С более новыми компиляторами можно объявить переменные, где вам нужны они вместо decl наверху функции.

char temp={'x','\0'};//120;//x

урегулирование size=0 здесь кажется немного странным

size=0;

лучше держать что вводы данных пользователем в отдельном буфере (вход) тогда, если это не "x", копируют его в ваш строковый массив так вместо

while(strcmp(string[i],temp)!=0)
{
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;
    counter++;
}

например.

while (fgets(input,sizeof(input),stdin) != NULL && input[0] != 'x')
{
   string[i] = calloc(1,strlen(input)+1);//add a byte for \0
   strncpy(string[i],input,strlen(input)-1);//not copying ending \n
   if ( ++i == size )//a new chunk needed
   {
     char *newstring = realloc((size + 10)*sizeof(char*), string );
     if ( newstring != NULL )
     {
       string = newstring;
       size += 10;
     }
   }
}
0
добавлено

Code Review

инициализируйте все свои переменные

  char *str = NULL,**string = NULL,buffer[50] = {0},temp[2] = {0};
  int i = 0,j = 0,q = 0,size = 10,counter = 0;

не бросайте то, что возвращено из malloc/calloc , и используйте {}, если это возможно, для ясности

string=calloc(size,sizeof(char*));
for (i=0; i

Когда чтение с клавиатуры не использует , получает , используйте fgets() , так как можно определить макс. размер, чтобы читать.

printf("\nGimme strings, terminate input with x");
char input[256];
fgets(input,sizeof(input),stdin);//another varname, will explain below

С более новыми компиляторами можно объявить переменные, где вам нужны они вместо decl наверху функции.

char temp={'x','\0'};//120;//x

урегулирование size=0 здесь кажется немного странным

size=0;

лучше держать что вводы данных пользователем в отдельном буфере (вход) тогда, если это не "x", копируют его в ваш строковый массив так вместо

while(strcmp(string[i],temp)!=0)
{
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;
    counter++;
}

например.

while (fgets(input,sizeof(input),stdin) != NULL && input[0] != 'x')
{
   string[i] = calloc(1,strlen(input)+1);//add a byte for \0
   strncpy(string[i],input,strlen(input)-1);//not copying ending \n
   if ( ++i == size )//a new chunk needed
   {
     char *newstring = realloc((size + 10)*sizeof(char*), string );
     if ( newstring != NULL )
     {
       string = newstring;
       size += 10;
     }
   }
}
0
добавлено

Code Review

инициализируйте все свои переменные

  char *str = NULL,**string = NULL,buffer[50] = {0},temp[2] = {0};
  int i = 0,j = 0,q = 0,size = 10,counter = 0;

не бросайте то, что возвращено из malloc/calloc , и используйте {}, если это возможно, для ясности

string=calloc(size,sizeof(char*));
for (i=0; i

Когда чтение с клавиатуры не использует , получает , используйте fgets() , так как можно определить макс. размер, чтобы читать.

printf("\nGimme strings, terminate input with x");
char input[256];
fgets(input,sizeof(input),stdin);//another varname, will explain below

С более новыми компиляторами можно объявить переменные, где вам нужны они вместо decl наверху функции.

char temp={'x','\0'};//120;//x

урегулирование size=0 здесь кажется немного странным

size=0;

лучше держать что вводы данных пользователем в отдельном буфере (вход) тогда, если это не "x", копируют его в ваш строковый массив так вместо

while(strcmp(string[i],temp)!=0)
{
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;
    counter++;
}

например.

while (fgets(input,sizeof(input),stdin) != NULL && input[0] != 'x')
{
   string[i] = calloc(1,strlen(input)+1);//add a byte for \0
   strncpy(string[i],input,strlen(input)-1);//not copying ending \n
   if ( ++i == size )//a new chunk needed
   {
     char *newstring = realloc((size + 10)*sizeof(char*), string );
     if ( newstring != NULL )
     {
       string = newstring;
       size += 10;
     }
   }
}
0
добавлено

Code Review

инициализируйте все свои переменные

  char *str = NULL,**string = NULL,buffer[50] = {0},temp[2] = {0};
  int i = 0,j = 0,q = 0,size = 10,counter = 0;

не бросайте то, что возвращено из malloc/calloc , и используйте {}, если это возможно, для ясности

string=calloc(size,sizeof(char*));
for (i=0; i

Когда чтение с клавиатуры не использует , получает , используйте fgets() , так как можно определить макс. размер, чтобы читать.

printf("\nGimme strings, terminate input with x");
char input[256];
fgets(input,sizeof(input),stdin);//another varname, will explain below

С более новыми компиляторами можно объявить переменные, где вам нужны они вместо decl наверху функции.

char temp={'x','\0'};//120;//x

урегулирование size=0 здесь кажется немного странным

size=0;

лучше держать что вводы данных пользователем в отдельном буфере (вход) тогда, если это не "x", копируют его в ваш строковый массив так вместо

while(strcmp(string[i],temp)!=0)
{
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;
    counter++;
}

например.

while (fgets(input,sizeof(input),stdin) != NULL && input[0] != 'x')
{
   string[i] = calloc(1,strlen(input)+1);//add a byte for \0
   strncpy(string[i],input,strlen(input)-1);//not copying ending \n
   if ( ++i == size )//a new chunk needed
   {
     char *newstring = realloc((size + 10)*sizeof(char*), string );
     if ( newstring != NULL )
     {
       string = newstring;
       size += 10;
     }
   }
}
0
добавлено