Почему const char * возвращает значение с двумя потерянными символами? Однако печатает правильное значение непосредственно перед возвратом [дубликата]

0

Это моя функция под названием trim, которая разделяет строку своих котировок:

const char* trim(const char* c) {

const char *pos = c;
//Getting the length of the string
int c_length = 0;
   while (*pos != '\0') {
       c_length++;
       pos++;
   }

cout<<"\nThis is the length of string:"<<c_length;
char c_store[c_length-2]; // Removing two for the quotes 
pos = c; 
const char* quote = "\"";
char ch;
int i;
for (i = 0; *pos != '\0'; pos++){
    ch = (char)*pos;
    if(ch!=*quote) {                           
        c_store[i] = (char)*pos;
        i++;            
    }
}
c_store[i]='\0';   // Adding the null terminating character
const char * c_trimmed = c_store;
cout<<c_trimmed;     // Prints the string CORRECTLY here !!
return c_trimmed;    // There is problem when it returns, see main
}

Теперь я читаю из объекта json :: value, преобразуя значение в строку, используя toStyledString(), а затем преобразуя его в const char *, используя c_str(). Я считаю, что эта строка содержит кавычки вокруг него, поэтому я передаю это значение в обрезку функции. Когда значение возвращает возвращенную строку, она заканчивается двумя символами в конце. Это главная причина, по которой я думаю, что проблема кроется:

int main(int argc, char** argv) {

// Reading json config file into a Json::Value type
char* config_file = read_file_into_string(argv[1]);
Json::Value Bootloading_config = create_json_object(config_file);

const char* bucket_name_json = Bootloading_config["Bootloading"]["bucket_name"].toStyledString().c_str(); // Storing value from json

const char* bucket_name_trimmed = trim(bucket_name_json); // Using trim function

const char* bucket_name = "nikhil-hax"; // Assigning another pointer for comparison

printf("\n Trimmed bucket_name:%s", bucket_name_trimmed); // It is printing the string  with the last two chars cut out

if(strcmp(bucket_name_trimmed,bucket_name) == 0) // To check
    cout<<"\nTRIM function Worked!!";
else cout<<"\nNOT working, look closer";

}

Есть ли утечка памяти где-то или какая-то другая деталь, которую я пропускаю? Некоторая помощь будет высоко оценена. благодаря

  • 1
    Локальные переменные являются локальными. Не возвращайте адрес какой-либо локальной переменной.
Теги:
pointers
memory-leaks

1 ответ

2
Лучший ответ

Сначала вы объявляете локальную переменную:

char c_store[c_length-2]; // Removing two for the quotes 

Затем вы копируете указатель на выделенную память (а не ее содержимое!):

const char * c_trimmed = c_store;

Теперь c_trimmed указывает на то же пространство в памяти, что и c_store. Затем вы печатаете его:

cout<<c_trimmed;     // Prints the string CORRECTLY here !!

Затем вы возвращаете его из функции:

return c_trimmed;    

И тогда память, на которую c_trimmed и c_store, автоматически освобождается:

}

После возвращения из функции его результат больше не указывает на допустимое место в памяти. Если вы хотите вернуть строку c-style из функции, вы должны выделить для нее память. Что-то вроде:

char * c_trimmed = new char[c_length-2];
strcpy(c_trimmed, c_store);
return c_trimmed;

// Don't forget to delete[] the result of this function when it is no longer needed
// or else you'll end up with memory leak

Нижняя заметка. Если вы действительно пишете в C++, а не в C, используйте std::string вместо этого - у вас будет половина проблем, которые у вас есть сейчас (и будут иметь в будущем).

  • 0
    Ах, я вижу, область локальных переменных заканчивается в конце функции усечения, таким образом, новая память должна быть выделена для указателя, который возвращается. Спасибо огромное Spook
  • 0
    Это потому, что память автоматически добавляется в std :: string? Да, хорошо, я сейчас использую странное сочетание C и C ++, потому что большинство внешних библиотек, которые я использую для своей программы, написаны на C.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню