我有一个通过引用函数传递设置大小为64的数组。我收到了警告
警告C4047:'功能' :' int *'间接水平与' int(*)[64]'
不同
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <stdint.h>
void hex_to_binary(char* hex, int* arr)
{
int decimal = strtol(hex,NULL,16);
int remainder=0;
int pos = 63;
while(decimal!=0)
{
remainder=decimal%2;
decimal/=2;
arr[pos]=remainder;
pos--;
}
}
void print_64bin(int* bin)
{
int pos;
for(pos=0; pos<64;++pos)
{
printf("%d",bin[pos]);
}
}
int main()
{
int bin[64]={0};
int q;
char hex[20];
printf("Enter hex\n");
scanf("%s",&hex);
hex_to_binary(&hex,&bin);
printf("Answer\n");
print_64bin(&bin);
}
任何人都可以解释为什么我这样做或提供解决方案?
答案 0 :(得分:2)
int[64] a;
不是有效的C声明。看起来您的编译器正在为您提取一些扩展技巧。你需要:
int a[64];
答案 1 :(得分:1)
间接是指通过指针访问变量。就像指针可以引用或指向变量(一个间接层)一样,指针也可以指向另一个指针,而指针又指向一个变量(两个间接层)。因为具有不同间接级别的两个指针可能引用两个不同的东西(一个可以指向一个变量,而另一个指向另一个指针),只要在表达式中包含这样的指针,编译器就会发出警告C4047。 / p>
例如,以下代码生成此警告但编译时没有更改:
void main() {
char **p;// two levels of indirection
char *q; // one level of indirection
p = q; // warning C4047
}
参考 - c4047 warning 1
答案 2 :(得分:1)
您没有正确调用这些功能。
您现在正在调用它们的方式,您传递了数组的地址,但您的函数需要指向int
的指针。
将数组传递给函数,而不使用address-of运算符&
。数组将衰减为指向第一个元素的指针。
hex_to_binary(hex,bin);
...
print_64bin(bin);