【问题标题】:Function's pointer return keeps changing previous values in an array函数指针返回不断改变数组中的先前值
【发布时间】:2022-01-09 21:31:06
【问题描述】:

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

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
    }`

【问题讨论】:

  • get_song_name 一遍又一遍地打开同一个文件,每次从头读取一行并返回它。更糟糕的是,它返回一个指向本地 str 数组的指针,该变量的生命周期将在函数返回时结束,从而使返回的指针无效。

标签: c pointers scope return-value undefined-behavior


【解决方案1】:

您需要动态分配字符串,使其生命周期不会结束,然后函数退出。

只需替换

return s;

return strdup(s);

编辑

由于不允许 OP 使用string.h 这里可以找到 https://stackoverflow.com/a/37132824/4989451 中的 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 = '\0';
    return str;
}

【讨论】:

  • 如果我不允许使用 ?我试图做动态分配,但我不能让它工作。
  • @noornapso,查看更新后的答案
【解决方案2】:

这个函数

char* get_song_name(const char* song)

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

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

此外,该函数始终返回相同的指针(本地数组的第一个元素的地址)。所以这个循环

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 中动态分配一个字符数组,该指针将从函数返回。

【讨论】:

    猜你喜欢
    • 2011-08-18
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多