警告:赋值从指针生成整数,而无需在 shellsort 算法中进行强制转换
Warning: assignment makes integer from pointer without a cast in shellsort algorithm
我正在编写一个程序来对数字数组执行 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;
}
该代码旨在return一个长*数组,并将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);
如果有任何遗漏的信息,请告诉我,非常感谢您的帮助。
将指向数组的指针作为附加参数传递,并对其进行操作。
void Generate_2p3q_Seq(long * arr, int length, int *seq_size) {
// Method stores result in pre-initialized arr.
}
// Call with:
long arr[1000];
Generate_2p3q_Seq(arr, length, seq_size)
// Result stored correctly in arr.
这里有两个主要问题。首先,你将arr
声明为long *arr[1000]
,这意味着它是指向long
的数组,而不是long
的数组.这就是为什么您要了解指针和整数之间的转换。
定义long
数组的正确方法是:
long arr[1000];
但这会导致第二个问题,即您正在 return 指向局部变量的指针。当函数 returns 的局部变量超出范围时,因此 returned 指针不再指向有效内存。
要解决此问题,请将 arr
声明为指针并使用 malloc
为其动态分配内存:
long *arr = malloc((product * power) * sizeof *arr);
if (!arr) {
perror("malloc failed");
exit(1);
}
然后可以returnarr
的值,指向动态分配的内存。
我正在编写一个程序来对数字数组执行 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;
}
该代码旨在return一个长*数组,并将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);
如果有任何遗漏的信息,请告诉我,非常感谢您的帮助。
将指向数组的指针作为附加参数传递,并对其进行操作。
void Generate_2p3q_Seq(long * arr, int length, int *seq_size) {
// Method stores result in pre-initialized arr.
}
// Call with:
long arr[1000];
Generate_2p3q_Seq(arr, length, seq_size)
// Result stored correctly in arr.
这里有两个主要问题。首先,你将arr
声明为long *arr[1000]
,这意味着它是指向long
的数组,而不是long
的数组.这就是为什么您要了解指针和整数之间的转换。
定义long
数组的正确方法是:
long arr[1000];
但这会导致第二个问题,即您正在 return 指向局部变量的指针。当函数 returns 的局部变量超出范围时,因此 returned 指针不再指向有效内存。
要解决此问题,请将 arr
声明为指针并使用 malloc
为其动态分配内存:
long *arr = malloc((product * power) * sizeof *arr);
if (!arr) {
perror("malloc failed");
exit(1);
}
然后可以returnarr
的值,指向动态分配的内存。