C: массив указателей на символы не работает должным образом динамически

У меня есть приведенные ниже фрагменты кода, где я пытаюсь использовать динамически выделяемый массив char * для хранения строк, поступающих из стандартного ввода.

char **reference
reference = calloc(CHUNK, sizeof(char *));

Я использую временный статический массив, чтобы сначала сохранить строку из stdin, а затем на основе определенного условия скопировать ее в массив char *. Я выделяю память отдельным char * во время выполнения.

                        reference[no_of_ref]=malloc(strlen(temp_in) + 1);
                        reference[no_of_ref++]=temp_in;
//                   printf(" in temp : %s , Value : %s   , Address of charp : %p\n",temp_in,reference[no_of_ref-1],reference[no_of_ref-1]);
                        memset(&temp_in,'\0',sizeof(temp_in));
                        pre_pip = -1;
                }

        /*If allocated buffer is at brim, extend it by CHUNK bytes*/
                if(no_of_ref == CHUNK - 2)
                        realloc(reference,no_of_ref + CHUNK);

поэтому no_of_ref содержит общее количество окончательно полученных строк. например 20. Но когда я печатаю весь массив reference, чтобы увидеть каждую строку, я получаю ту же самую строку, которая была последней, и печатается 20 раз.


person Diwakar Sharma    schedule 04.11.2013    source источник


Ответы (1)


Здесь из вашего кода возникает проблема:

reference[no_of_ref]=malloc(strlen(temp_in) + 1);
reference[no_of_ref++]=temp_in;

Это потому, что присваивание указателей в C влияет на указатели и только на указатели, которые ничего не делают со своим содержимым. Вы должны использовать такие вещи, как memcpy или strcpy:

reference[no_of_ref]=malloc(strlen(temp_in) + 1);
strcpy(reference[no_of_ref], temp_in);
no_of_ref+=1;
person starrify    schedule 04.11.2013
comment
Бах... Это то, о чем я знаю, и до сих пор забываю каждый раз, когда работаю с копированием char *. Спасибо, что напомнили еще раз..!! - person Diwakar Sharma; 04.11.2013
comment
@DiwakarSharma очень приятно помочь :) - person starrify; 04.11.2013