Проблем при опит за съхраняване на char[] в char*

В момента разработвам уеб приложение на C на Debian (не ме питайте защо). Направих метод за получаване на данните от формуляр с помощта на POST:

const char* getParam(char* postResult, char* param)
{
char stock[30];
char* pointer = strstr(postResult, param);
while(*pointer != 61)
    pointer++;

int i = 0;
++pointer;
while(*pointer != 38)
{
    stock[i] = *pointer;
    i++;
    *pointer++;
}
stock[i] = 0;
const char *result;
if(stock[0] == 0) {
    result = "";
}else{
    result = stock;
}
return result;
}

когато извиквам този метод, съхранявам данните в променлива, декларирана от

char fname[40]; 

като този

strcpy(fname,getParam(ptr, "firstn"));

След това, когато се опитва да покаже данните, показва странни знаци.


person Guillaume Drillaud    schedule 24.11.2017    source източник
comment
Не ме питайте защо Защо? Връщате указател към локална променлива. Моля, следвайте предупрежденията на вашия компилатор. Ако няма предупреждение, активирайте всички възможни предупреждения в GCC.   -  person tilz0R    schedule 24.11.2017
comment
Използвам gcc и той не показва никакво предупреждение, дори когато използва -Wall, показва само неизползваните неща.   -  person Guillaume Drillaud    schedule 24.11.2017
comment
Не забравяйте да използвате gcc -Wall ... (не съм сигурен обаче, че вижда този)   -  person Breaking not so bad    schedule 24.11.2017
comment
в този случай не се издава предупреждение, защото присвоявате локалния буфер на указател. Компилаторът е загубен в този момент и не може да издаде предупреждението.   -  person Jean-François Fabre    schedule 24.11.2017
comment
@GuillaumeDrillaud винаги коригира всички предупреждения, дори и неважните. ако не го направите, след няколко месеца вашият код издава 3003434 предупреждения и не виждате важните.   -  person Jean-François Fabre    schedule 24.11.2017


Отговори (2)


Връщате указател към локална променлива (сток), която вече не е налична, ако функцията е завършена.

Направете запаса статичен, за да остане или го направете динамично разпределена памет, или предайте fname във функцията и го съхранете там.

Във всеки случай трябва да сте сигурни, че паметта, в която съхранявате съдържанието, е там, докато го използвате.

person chris01    schedule 24.11.2017

Вместо да връщате указател към локална променлива вътре в getParam(), можете да предадете указател към буфер.

const char* getParam(char *stock, char* postResult, char* param)
{
  // char stock[20] you do not need that anymore
  char* pointer = strstr(postResult, param);
  while(*pointer != 61)
    pointer++;

  // int i = 0;
  ++pointer;

  // Move that up
  if( pointer==0 )
  {
    *stock=0;
    return;
  }

  while(*pointer != 38)
  {
    *stock = *pointer;
    stock++;
    *pointer++;
  }
  stock = 0;

}

В този случай не е необходимо да използвате и strcpy():

char fname[40]; 
getParam(fname, ptr, "firstn"));

Написано в браузъра.

Трябва обаче да проверите за твърде дълги аргументи и за низове без 38. Във вашата текуща версия има вектор за атака за препълване на буфер.

person Amin Negm-Awad    schedule 24.11.2017