如何分配从函数返回的变量

时间:2013-06-30 18:48:30

标签: c cgi

我是C的新手,我正在尝试将一个从主函数之后的decode函数返回的数组分配给指针,以便我可以在我的程序中使用它(例如打印它)。代码编译,但是当我运行CGI时,我得到一个“错误500”。

#include <stdio.h>
#include <string.h>
#include <stddef.h>
#include <stdlib.h>

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

printf("Content-type: text/html\n\n");

char *decode(char *url);

char *qPtr;
char *ePtr;
char *emailClean;

if(qPtr = getenv("QUERY_STRING")) {
  char Buffer[256];
  char *Token;
  char username[80], password[80], email[80];
  strncpy(Buffer, qPtr, 255); //copy Env variable "QUERY_STRING" into qPtr pointer

  Token = strtok(Buffer, "&"); //get first query
  sscanf(Token, "username=%s", username); //gets value of username field input

  Token = strtok(NULL, "&"); //get second query
  sscanf(Token, "password=%s", password); //gets value of password field input

  Token = strtok(NULL, "&"); //get third query
  sscanf(Token, "email=%s", email); //gets value of email field input

  ePtr = email;

//decode email
  emailClean = decode(ePtr);
 printf("%s\n", *emailClean);

}
 else { printf("<p>Error: did not get a QUERY_STRING variable."); }
 }

char *decode(char *url) {
  char *emailNew;
  int i = 0;
  int y = 0;
  char current = url[i];

while(current != '%') {
   emailNew[i] = current;
   y++;
   current = url[i++];
 }
  return emailNew;
}

谢谢!

3 个答案:

答案 0 :(得分:1)

  char *emailNew;

  /* ... */

  while(current != '%') {
     emailNew[i] = current;
     y++;
     current = url[i++];
  }

emailNew指针未初始化,因此emailNew[i] = current赋值调用未定义的行为。

此外:

 printf("%s\n", *emailClean);

emailClean已经是char *%s需要char *,所以您实际上想要这样做:

 printf("%s\n", emailClean);

我强烈建议您在编译器选项中启用所有警告并修复所有警告。

答案 1 :(得分:1)

尝试使用malloc语句分配必要的字节并在函数中返回指向它的指针。

您可以将字符串的maxsize作为参数传递给函数,以便了解要分配的字节数。 或者您可以使用另一种方法来查找要分配的大小,例如查找值为0的第一个字符(如果是C C null终止字符串)。

然后,就这样做:

emailNew = malloc(max_bytes);

然后,在函数外部,您可以使用“free”语句释放您使用malloc分配的内存。

答案 2 :(得分:0)

如已经诊断,您的函数decode()没有正确分配空间。

然而,它也会遇到另一个(以前未确诊的)问题;如果电子邮件地址不包含%,它会读取无关的内存,直到找到某个地址。不太重要的是,变量y没有任何用处;你初始化并递增它,但从未读过它的值。

我认为代码应该更像是:

char *decode(char *url)
{
    char *emailNew;
    char *end = strchr(url, '%');
    if (end == 0)
        end = url + strlen(url);
    emailNew = malloc(end - url + 1);
    if (emailNew != 0)
    {
        memmove(emailNew, url, end - url);  // Or memcpy()
        emailNew[end - url] = '\0';
    }
    return emailNew;
}

这使用标准C库函数来查找字符串中的字符 - strchr()。如果找不到百分号,则使用整个字符串。分配足够的空间;如果成功,则将字符串(可能不会以空值终止)复制到已分配的空间中,并将null终止该字符串。然后返回数据。

你也可以按照以下方式重写它在你的函数中进行搜索:

char *decode(char *url)
{
    char *emailNew;
    int i;
    char current;

    for (i = 0; (current = url[i]) != '%' && current != '\0'; i++)
        ;

    emailNew = malloc(i + 1);
    if (emailNew != 0)
    {
        memmove(emailNew, url, i);
        emailNew[i] = '\0';
    }
    return emailNew;
}