编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]
Posted
技术标签:
【中文标题】编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]【英文标题】:Compiler shows the error message "makes pointer from integer without cast" (reversing an array). How do i resolve this? [closed] 【发布时间】:2019-12-13 17:06:39 【问题描述】:代码如下。调用函数reverse_array时,如何将函数的第一个参数定义为数组?
#include <stdio.h>
void swap(int* a, int* b);
void reverse_array(int a[], int n)
int* b = a + n - 1;
while (b > a)
swap(a, b);
a = a + 1;
b = b - 1;
void swap(int* ptra, int* ptrb)
int t;
t = *ptra;
*ptra = *ptrb;
*ptrb = t;
main()
int b[5] = 1,2,3,4,5 ;
reverse_array(b[5], 5);
int x;
for (x = 0; x < 5; x++)
printf("%d", b[x]);
【问题讨论】:
投票结束是一个错字。reverse_array(b[5], 5);
应该是 reverse_array(b, 5);
b[5]
是一个int
并且超出了范围。数组的名称不是b[5]
,而是b
。
@NathanOliver-ReinstateMonica 我经常看到这种类型的错误,所以这不应该是错字,而是错误来自误解。更好的行动应该是搜索要在重复投票中使用的问题。
@NathanOliver-ReinstateMonica 是的,这里真的不是错字。从初学者的角度来看,b[5]
可能看起来有点像数组的名称。
这篇文章怎么跑题了?可能会重复,但肯定不会离题。
【参考方案1】:
b[5]
不是整个数组,而是数组的第6个元素(索引从0开始),不存在。
您应该改为传递b
。这将被转换为指向数组第一个元素的指针。
【讨论】:
【参考方案2】:当你写作时
`reverse_array(b[5], 5)`,
您将 int 作为第一个参数而不是 整数数组。
【讨论】:
为什么这被否决了?虽然它的格式很差而且有点简洁,但它仍然是一个有效的答案。也许我们不应该如此刻意地打击新用户【参考方案3】:编译器显示错误消息“从整数中生成指针而不进行强制转换”(反转数组)。我该如何解决这个问题?
不要将int
传递到需要指针的位置。 :)
背景:
在函数定义的上下文中,int a[]
与 int * a
相同,因此 a
是指向 int
的指针。
你的调用者传递了b[5]
,这是int
数组b
的第6个元素,所以它是一个int
(顺便说一句,一个越界访问,在C数组中是@987654330基于@,因此b
的元素通过范围从0 到4 的索引来寻址。
要“传递”数组,只需提供b
。
reverse_array(b, 5);
然后数组b
将衰减到其第一个元素的地址。该地址在函数中作为值a
接收。
【讨论】:
以上是关于编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章