簡體   English   中英

函數的指針返回不斷改變數組中的先前值

[英]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
    }`

您需要動態分配字符串,使其生命周期不會結束,然后函數退出。

只需更換

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

本 function

char* get_song_name(const char* song)

可以調用未定義的行為,因為它返回一個無效指針,該指針指向 function 的本地數組,該數組在退出 function 后將不再存在

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

此外,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
    }`

沒有意義。

您需要在 function 中動態分配一個字符數組get_song_name一個從 function 返回的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM