在函数中更改指针char值

时间:2015-12-09 14:18:48

标签: c pointers char

我尝试解析客户端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);
}

2 个答案:

答案 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);
}