编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]

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 接收。

【讨论】:

以上是关于编译器显示错误消息“从不强制转换的整数中生成指针”(反转数组)。我该如何解决这个问题? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何控制 toad 消息窗口中显示的错误数量

无法显示消息对话框

“分面项目问题(Java 版本不匹配)”错误消息

JDeveloper 错误窗格未显示

如何在消息框中显示数据库值

Qt Creator 在新项目中显示错误,但代码编译正常