将指针参数传递给其他文件中的函数

时间:2014-07-18 22:50:26

标签: c pointers

我正在尝试一个非常基本的程序......它是关于生成一个数组,返回它的指针并在插入排序中使用这个指针。事实是main,sort和generate是程序中的不同文件,当使用指针作为排序函数的参数时,我在指针中没有正确的数字。 我很感激一些帮助!

这就是我生成指针的方法......

int
* (generate_matrix) (int number)
{
    srand((unsigned int) time(NULL)); //retirar o null para parar gerar aleatorio
    int array_data[number];
    ptr = (int *) malloc(number*sizeof(int));
    // TODO: comment me
    for (int i = 0; i < number; i++)
    {
        array_data[i] = (rand() % LIMIT);
        printf("%d\n", array_data[i]);
    }
    printf("*****************inside generate array ****************\n");
    ptr = &array_data[0];
    for (int i = 0; i < number; i++)
        printf("%d\n", ptr[i]);
    printf("*****************inside generate ptr ****************\n");
    return ptr;
}

这是我对它进行排序的方式......

void sort(int ptr[],int number)
{
    printf("before sort:\n");
    printf("number: %d:\n",number);

    for (int i = 0; i < number; i++)
        printf("%d\n", ptr[i]);

    printf("*************\n");

    for (int j=1; j < number; j++)
    {

        int key = ptr [j];
        //printf("%d\n", ptr[j]);
        int i = j - 1 ;
        while (i >= 0 && ptr [i] > key)
        {
            ptr [i + 1] = ptr [i];
            i--;
            ptr [i + 1] = key;
            //printf("%d\n", ptr[i])
        }
    }
    printf("Sorted list in ascending order:\n");

    for (int i = 0; i < number; i++)
        printf("%d\n", ptr[i])
}

通过xcode按照以下答案。

65459 28173 10284
*****************inside generate array ****************  65459 28173 10284
*****************inside generate ptr ****************  65459 28173 10284
***************** after paasage to  find ****************  before sort: number: 3  0 0 0
************* Sorted list in ascending order: 0 0 0

1 个答案:

答案 0 :(得分:2)

那是因为你要将ptr分配给本地数组,例如:

int array_data[number]; // <-- the local array
    ptr = (int *) malloc(number*sizeof(int));

你正在失去它的内容:

ptr = &array_data[0];

哪个是内存泄漏。

所以,做:

int* (generate_matrix) (int number) {
  srand((unsigned int) time(NULL)); //retirar o null para parar gerar aleatorio

  int* ptr = (int *) malloc(number*sizeof(int));
  if (NULL == ptr) { // don't forget to check for NULL
    // error
    return NULL;
  }

  for (int i = 0; i < number; i++) {
    ptr[i] = (rand() % LIMIT);
  }
  return ptr;
}

就是这样!

至于使用int* ptrint ptr[]之间的区别,我不记得除了语义之外的真正原因(例如:int*是指向int的指针,int ptr[]是一个int数组,但ptr[i]&lt; =&gt; *(ptr + i))