尝试将 char[] 存储到 char* 时出现问题

Probleme when trying to store char[] into char*

我目前正在 Debian 上用 C 语言开发 Web 应用程序(不要问我为什么)。 我使用 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"));

然后在尝试显示数据时显示奇怪的字符。

您正在返回一个指向局部变量 (stock) 的指针,如果函数完成,该变量将不再可用。

使库存保持静态以使其保持不变 要么 使其成为动态分配的内存 要么 将 fname 传递给函数并将其存储在那里。

在任何情况下,您都需要确保存储内容的内存在您使用时一直存在。

相反,返回指向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 的字符串。在您当前的版本中,存在缓冲区溢出的攻击向量。