我尝试解析客户端HTML GET请求并获取他想要发送的文件的地址。但是当我将参数传递给路径变量中的函数时输出不好。
解析器函数printf:New file path returned is=/somedir/index.html
主要功能printf:In main path=random chars
有什么问题?
int parser(char* buffer,char **newPath)
{
int numberOfChars = 0;
int index = 4;//start at 4 char
while(buffer[index] != ' '){
numberOfChars++;
index++;
}
// in numberOfChars is number of path characters from while loop
// this part of code is in if statment but it is irrelevant now
char filePath[numberOfChars];
strncpy(filePath,buffer+4,numberOfChars);
char* fullPath;
fullPath = filePath;
char name[] = "index.html";
strcat(fullPath,name);
(*newPath) = fullPath;
printf("New file path returned is=%s\n",(*newPath));
return 1;
//some more code if file is .sh or .bash or .png ...
.
.
}
主
int main(int argc, char *argv[])
{
//some code
.
.
.
char* path;
//msg is client HTML get request i want parse it and send data
// which he wants
parser(msg,&path);
printf("In main path=%s\n",path);
}
答案 0 :(得分:1)
char filePath[numberOfChars];
char* fullPath;
fullPath = filePath;
....
(*newPath) = fullPath;
filePath
具有自动存储持续时间,您将在其生命周期结束后访问它。这是undefined behaviour。
相反,您可以使用malloc()
和strcpy()
将字符串复制到*newPath
。
替换
(*newPath) = fullPath;
使用:
*newPath = malloc(strlen(fullPath) + 1);
if (*newPath == NULL) {
/* handle error */
}
strcpy(*newPath, fullPath);
并致电main()
中的free()
取消分配。
如评论中所述,您需要为'\0'
终结符分配一个额外字节。你可以通过分配一个额外的字节来处理这个问题:
char filePath[numberOfChars + 1];
strncpy(filePath,buffer+4,numberOfChars);
filePath[numberOfChars] = '\0';
strncpy()
使用NUL字节自动填充内存中的其余部分。在这种情况下,只是最后一个字节。通常,您不希望使用strncpy()
,因为没有必要用NUL字节填充剩余的缓冲区。
答案 1 :(得分:1)
您正在返回指向局部变量的指针。当函数退出时,该变量超出范围,其占用的内存可用于其他目的,导致undefined behavior。
您的函数需要为字符串(和NULL终止符)动态分配空间并返回指向该缓冲区的指针。然后,您需要确保在调用函数中free
:
int parser(char* buffer,char **newPath) {
....
char *filePath = malloc(numberOfChars+1);
if (filePath == NULL) {
perror("malloc failed");
exit(1);
}
...
}
int main(int argc, char *argv[])
{
...
parser(msg,&path);
printf("In main path=%s\n",path);
free(path);
}