我定义了一个函数来读取整数数组并将其作为指针返回。
#include "stdafx.h"
#include <stdio.h>
const int size = 5;
int* getInput();
int main(int argc, _TCHAR* argv[])
{
int* a = getInput();
for(int i = 0; i < size; i++){
printf("%d n", a[i]);
}
return 0;
}
int* getInput(){
int input[size];
for(int i = 0; i < size; i++){
scanf("%d", &input[i]);
}
return input;
}
问题是输入:
1
2
3
4
5
该程序打印如下内容:
1
5242692
1474139472
872394811
-2
我不明白为什么会这样。谁能帮我解决这个问题?
getInput()
返回具有自动存储的本地数组的地址:在函数返回后访问此对象具有未定义的行为。您观察到的是数组的内容被printf
覆盖,因为它对自己的局部变量使用相同的空间。 该行为是未定义的,这意味着任何事情都可能发生,包括程序失败。
还要避免定义全局变量,尤其是使用简单的名称(如 size
(。
您应该传递目标数组及其元素数:
#include <stdio.h>
int getInput(int *dest, int size);
int main(int argc, char *argv[]) {
const int size = 5;
int input[size];
int n = getInput(input, size);
for (int i = 0; i < n; i++) {
printf("%dn", a[i]);
}
return 0;
}
int getInput(int *dest, int size) {
int i;
for (i = 0; i < size; i++) {
if (scanf("%d", &input[i]) != 1)
break;
}
/* return the number of integers successfully read from stdin */
return i;
}
函数中的数组 - 当函数结束时,它的生存期结束。要执行您期望执行的操作,您需要分配内存并将其返回。因为它的生命周期将一直持续到程序结束或您释放它。
您可能希望执行以下操作:
int *input = malloc(sizeof *input *size);
if( input == NULL)
{
// error
}
..
return input;
在您的情况下,您通过访问超出范围的变量来调用未定义的行为。
int* getInput(){
int *input = malloc(sizeof *input *size);
if( input == NULL)
{
fprintf(stderr,"%s","Error in allocation");
exit(1);
}
for(size_t i = 0; i < size; i++){
scanf("%d", &input[i]);
}
return input;
}
应释放使用malloc
获得的已分配内存以避免内存泄漏。您可以在完成处理后执行此操作。
main()
您只需要释放内存。
int main(int argc, _TCHAR* argv[]){
...
...
free(a);
}
在这里,您可以使用常量变量size
将其传递给函数并分配不同的内存量,并相应地从用户那里获取输入。对于较大的 size
值,您可以将 size
的值传递给函数。
最好检查scanf()
的返回值。所以对它的调用应该是
if( scanf("%d",&input[i])== 1)
// ok
您可以在此处查看详细讨论。