c - 警告 : assignment makes integer from pointer without a cast in shellsort algorithm

标签 c arrays sorting pointers shellsort

我正在编写一个程序来对数字数组执行 shellsort。我首先必须生成将执行 shellsort 的数字序列。该函数用于生成 2^p*3^q 形式的数字,该数字小于要排序的数组的长度。然后我对刚刚生成的序列数组进行排序。这是我的实现:

long * Generate_2p3q_Seq(int length, int *seq_size) {
  int ind = 0;
  long * arr[1000];
  int product;
  int power = 1;
  while (power < length) {
    product = power;
    while (product < length) {
      arr[ind] = product;
      product *= 3;
      ind++;
    }
    power *= 2;
  }
  int i, j, k;
  for (i = 0; i < ind; ++i) {
    for (j = i + 1; j < ind; ++j)
    {
      if (arr[i] > arr[j])
      {
        k =  arr[i];
        arr[i] = arr[j];
        arr[j] = k;
      }
    }
  }
  *seq_size = ind;
  for (int count = 0; count < ind; count++) {
    printf("arr[%d] = %li\n", count, arr[count]);
  }
  return arr;
}

该代码旨在返回一个 long * 数组并将 seq_size 设置为序列数组的长度。例如,如果给定一个要排序的 16 个整数的数组,则此处生成的序列数组应为 8 个整数 (1, 2, 3, 4, 6, 9, 8, 12),并且 seq_size 应等于 8。相信我对指针的理解是错误的,因为我的终端输出如下所示:

sequence.c: In function ‘Generate_2p3q_Seq’:
sequence.c:14:16: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
       arr[ind] = product;
                ^
sequence.c:26:11: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
         k =  arr[i];
           ^
sequence.c:28:16: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
         arr[j] = k;
                ^
sequence.c:34:25: warning: format ‘%li’ expects argument of type ‘long int’, but argument 3 has type ‘long int *’ [-Wformat=]
     printf("arr[%d] = %li\n", count, arr[count]);
                       ~~^            ~~~~~~~~~~
                       %ln
sequence.c:36:10: warning: return from incompatible pointer type [-Wincompatible-pointer-types]
   return arr;
          ^~~
sequence.c:36:10: warning: function returns address of local variable [-Wreturn-local-addr]

但是,我不确定如何更改它以使其正常工作。我用以下方式调用这个函数:

  long * sequence = Generate_2p3q_Seq(size, &seq_size);

如果我遗漏了任何信息,请告诉我,我非常感谢您的帮助。

最佳答案

这里有两个主要问题。首先,将 arr 声明为 long *arr[1000],这意味着它是一个指向 long 的指针数组>,不是 long 数组。这就是为什么您要进行指针和整数之间的转换。

定义long数组的正确方法是:

long arr[1000];

但这会导致第二个问题,即您返回一个指向局部变量的指针。当函数返回时,其局部变量超出范围,因此返回的指针不再指向有效内存。

要解决此问题,请将 arr 声明为指针并使用 malloc 为其动态分配内存:

long *arr = malloc((product * power) * sizeof *arr);
if (!arr) {
    perror("malloc failed");
    exit(1);
}

然后就可以返回arr的值,它指向动态分配的内存。

关于c - 警告 : assignment makes integer from pointer without a cast in shellsort algorithm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54735569/

相关文章:

c - C 中的链表实现选项

c - 为什么 setlocale 给我?而不是普通的字母?

c++ - WinHttpDetectAutoProxyConfigUrl 始终失败,错误代码为 12180 (ERROR_WINHTTP_AUTODETECTION_FAILED)

c - 将结构传递给函数并将值存储在结构的元素中

php - foreach($_SESSION AS $value){...} -> 获取 session 的数组键

javascript - ng-repeat 非数组对象

java 设置字母在一定范围内的循环使用

java - 如何理解或解释 Quicksort 中对分区的第一次调用?

C# 用数字对数组列表进行排序

c - 冒泡排序 - 交换计数器方法