【问题标题】:Probleme when trying to store char[] into char* [duplicate]尝试将 char[] 存储到 char* 时出现问题 [重复]
【发布时间】:2017-11-24 05:50:08
【问题描述】:

我目前正在 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"));

然后,当尝试显示数据时,它会显示奇怪的字符。

【问题讨论】:

  • 别问我为什么为什么?您正在返回指向局部变量的指针。请遵循编译器上的警告。如果没有警告,请在 GCC 中启用所有可能的警告。
  • 我使用 gcc,即使使用 -Wall 也不会显示任何警告,它只显示未使用的内容。
  • 一定要使用gcc -Wall ...(虽然不确定它是否看到这个)
  • 在这种情况下不会发出警告,因为您将本地缓冲区分配给指针。编译器此时丢失,无法发出警告。
  • @GuillaumeDrillaud 总是修复所有警告,即使是“不重要的警告”。如果你不这样做,几个月后你的代码会发出 3003434 警告,而你看不到重要的警告。

标签: c debian strcpy strcat


【解决方案1】:

如果函数完成,您将返回一个指向局部变量(股票)的指针。

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

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

【讨论】:

    【解决方案2】:

    而不是返回一个指向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"));
    

    在浏览器中输入。

    但是,您应该检查太长的 args 和没有 38 的字符串。在您当前的版本中,存在缓冲区溢出的攻击向量。

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 2011-05-12
      • 2016-02-18
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      相关资源
      最近更新 更多