strstr是否返回指向已分配内存的指针,需要我稍后手动释放它?

问题描述

我有一个解析器方法,用于解析API调用。我在解析函数中使用strstr()。 我的parse_api函数允许我返回strstr返回的指针。 我是否可以假设strstr分配了一个内存空间并且需要释放它,对吗?

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

char *parse_api(char *str);

int main() {
    char str[] = "dadsadsdsdsdamountdsafoodsd";
    puts(parse_api(str));
    return 0;
}
  
char *parse_api(char *str) {
    char *needle;
    char *updated_needle;
    needle = strstr(str,"amount");
    puts(needle);
    updated_needle = needle + 9;
    updated_needle[strlen(updated_needle) - 3] = '\0';
    return updated_needle;
}

解决方法

strstr函数不会返回分配的内存。它返回一个指针,指向haystack参数内子字符串的开头。

因此,在这种情况下,strstr将返回str + 12

,

在文档中,strstr下面描述了返回值:

指向str中找到的子字符串的第一个字符的指针;如果未找到该子字符串,则为空指针。如果substr指向一个空字符串,则返回str

当它说它返回一个指向子字符串第一个字符的指针时,它的意思是从字面上看。它指向str中的位置。对于您的情况,它返回str + 12。没有分配内存。

注意:这意味着如果更改或释放strstr,则str返回的值将不再有效!