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