比如说我有一个从main调用的函数,它返回一个指针:
修改 :我有点不清楚,对不起!让我们说我在main()中使用了scanf然后将其传递给函数,我想将参数复制到一个新指针然后返回那个。
main(void)
{
char *word = malloc(50);
scanf("%s", word);
printf("%s", function(word));
}
char *function(char *array)
{
char *a = malloc(50);
while (*array)
{
*a = *array;
a++;
array++;
}
return a;
}
在这种情况下,如果我尝试将指针数组返回到main,则指针将指向超出我的值所在位置的内存位置。
我怎样才能这样做,我可以再次将指针返回第一个值?
谢谢!
答案 0 :(得分:3)
最好的方法是不要增加你的指针:
char *function(char *array)
{
const size_t maxLength = 49;
char * a = malloc(maxLength + 1);
if ( !a ) {
perror("couldn't allocate memory");
exit(EXIT_FAILURE);
}
size_t i;
for ( i = 0; array[i] && i < maxLength; ++i ) {
a[i] = array[i];
}
a[i] = '\0';
return a;
}
您的原始代码未终止a
,但您将其传递给printf()
,就好像它是一个字符串一样。此外,您还会泄漏记忆,因为您不会存储您要返回的指针,因此您永远不能free()
它。
答案 1 :(得分:1)
基本方法是使用临时变量来保存您想要保留的指针值。
假设您的示例中唯一关注的是a
。
char *function(char *array)
{
char *a, *t;
t = a = malloc(50);
while (*array)
{
*t = *array;
++t;
++array;
}
*t = '\0'; /* since the caller passes returned pointer to printf() */
return a; /* a unchanged, so return it */
}
请注意,如果strlen(array) >= 50
,则上述内容将具有未定义的行为。
在您的示例中,array
按值传递,因此对其的更改(重复递增)不会传播给调用者 - 无需将array
重置为其原始值。< / p>
答案 2 :(得分:0)
最好的方法是不要在函数中使用参数,而是在函数内部复制它。
char* pTmp = array;
最好是使用++ pTmp而不是array ++,因为对于非POD类型,它可以更快。