函数的指针 return 不断更改数组中的先前值

Function's pointer return keeps changing previous values in an array

我试图用字符串填充二维数组,问题是我设法填充了第一个索引,但是当我继续处理下一个字符串时,它会不断更改以前的索引。可能是指针的问题,这是相关代码。

char* get_song_name(const char* song)
{
    strip(song);
    FILE* fp = fopen(song, "r");
    char str[9999];
    while(!feof(fp))
    {
        fgets(str,9999,fp);
        puts(str);
        strip(str);
        char* s = str;
        return s;
    }

` DIFFERENT FUNCTION:
for(i=0;i<lines;i++)
    {
        char *st = fgets(buff, 250, fp);
        st = create_path("c:\Users\Marian\Desktop\beatles", st);
        name[i] = get_song_name(st); //WORKS HOWEVER CHANGES PRVIOUS INDEXES VALUE TOO
    }`

这个函数

char* get_song_name(const char* song)

可以调用未定义的行为,因为它returns一个指向函数局部数组的无效指针,该指针在退出函数后将不再存在

char str[9999];
//...
char* s = str;
return s;

此外函数总是returns相同的指针(本地数组第一个元素的地址)。所以这个循环

for(i=0;i<lines;i++)
    {
        char *st = fgets(buff, 250, fp);
        st = create_path("c:\Users\Marian\Desktop\beatles", st);
        name[i] = get_song_name(st); //WORKS HOWEVER CHANGES PRVIOUS INDEXES VALUE TOO
    }`

没有意义。

您需要在函数内动态分配一个字符数组get_song_name一个将从函数返回的指针。

您需要动态分配字符串,这样它的生命周期才不会结束然后函数退出。

直接替换

return s;

return strdup(s);

编辑

因为 OP 不允许使用 string.h 这里可以找到 在

中找到的 strdup() 的实现
#include <stdlib.h>

char *ft_strdup(char *src)
{
    char *str;
    char *p;
    int len = 0;

    while (src[len])
        len++;
    str = malloc(len + 1);
    p = str;
    while (*src)
        *p++ = *src++;
    *p = '[=12=]';
    return str;
}