【问题标题】:Returning pointer to array doesn't give expected output in c [duplicate]返回指向数组的指针不会在c中给出预期的输出[重复]
【发布时间】:2017-02-26 19:32:30
【问题描述】:
#include <stdio.h>

int* createReverseArray(int *array, int size)
{
    int i;
    int newArray[size];
    for(i=size-1; i>=0; i--)
    {
        newArray[i] = array[size-i-1];
    }

    return newArray;
}

int main(void) {

    int myArray[] = {1,2,3,5,1};
    int myArray2[] = {1,2,3,4,2,1};
    int i;

    int size = sizeof(myArray)/sizeof(int);
    printf("Size: %d\n", size);
    int* newArray = createReverseArray(myArray, size);

    for(i=0; i<size; i++)
    {
        printf("%d, ", newArray[i]);
    }

    return 0;
}

我在 createReverseArray 函数中打印了数组并得到了正确的输出,但是当我将指针返回到数组然后尝试打印结果时,我认为它正在打印指向每个数组点的指针?我不太确定。

这会返回:

尺寸:5

12341002, 1, -10772231820, -1077231812, 1074400845,

【问题讨论】:

  • 这是一个经典的错误,我很确定之前在 StackOverflow 上已经有人问过这个错误。您正在返回一个指向函数内部分配的内存的指针,该函数将消失。 Go 语言足够聪明,可以完成这项工作并将内存移动到堆中,但 C 无法做到这一点。你必须自己为这个数组分配空间。
  • @RayToal:它只被问了 1000 多次......是的,这是一个非常基本的错误,它是由于没有从语言的基本概念开始造成的。就像从一本好的 C 书中得到的一样。

标签: c arrays pointers


【解决方案1】:

newarray 是一个自动局部变量。一旦函数返回,它将不再存在。返回指向自动局部变量的指针调用undefined behaviour,在这种情况下不会有任何好处。

你可以动态分配内存,然后返回指向它的指针

int *newArray = malloc(sizeof(int)*size); 

【讨论】:

  • 即使我在 createReverseArray() 中调用了 malloc,是否可以在 main 函数中释放内存?
  • @DJSweetness;是的。阅读free 函数的工作原理。
猜你喜欢
  • 2021-08-27
  • 2020-04-11
  • 2011-02-07
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多