我有一个动态分配的指针数组,每个指针指向一个文件中的一行文本。我需要提取文件的第四列(文件中的值用逗号分隔),这样我以后就可以按该列对文件进行排序。我已经能够提取第四列文本,但是我无法将其返回到我的main函数中使用,当我返回它时,它是空白的,可能是什么问题?
getStart在所需列
之前找到逗号int getStart(char** addresses, int index)
{
int i = 0;
int count = 0;
for(i=0;i < strlen(addresses[index]); i++)
{
if(addresses[index][i] == ',')
count += 1;
if(count == 3)
return i+1;
}
}
getStop在所需列的结尾之前找到逗号
int getStop(char** addresses, int index)
{
int i = 0;
int count = 0;
for(i=0;i < strlen(addresses[index]); i++)
{
if(addresses[index][i] == ',')
count += 1;
if(count == 4)
return i;
}
}
getSubject获取start和stop之间的所有字符,并将它们放入一个数组中(这是我需要返回main的数据)
char* getSubject(char** addresses, int index)
{
int i = 0;
int start;
int stop;
char* final;
char subject[10];
start = getStart(addresses, index);
stop = getStop(addresses, index);
for(start; start<stop; start++)
{
subject[i] = addresses[index][start];
i++;
}
final = subject;
printf("%s %s\n", final, subject);
return final;
}
我知道函数的工作方式是
printf("%s %s\n", final, subject);
打印正确的值,但是当我在main中调用它时,如下所示:
char* test;
test = getSubject(addresses, 43);
printf("%s\n", test);
test打印一个空白值。这是为什么?
答案 0 :(得分:2)
您使final
指向本地数组subject
,然后返回该指针。这意味着你实际上正在返回一个指向本地subject
数组的指针,一个数组在函数返回后超出范围,留下一个迷路指针和undefined behavior。
您需要为最终字符串分配内存,通常有两种方法:
使用例如strdup
在函数中分配内存并返回指向新内存的指针。
将指向内存足够的缓冲区的指针作为函数的参数传入,并将字符串复制到该缓冲区。
答案 1 :(得分:1)
你正在返回一个指向堆栈变量的指针,你不能这样做。返回后,堆栈将被清除。制作副本
return strdup(final);
调用必须在完成后释放它