C中的代码:在64位系统中发出int数组函数参数

以下C代码在32位Linux上完美工作,但不在64位系统中工作:

#define MAX 5 int change(int** ns) { ns[0] = 111; ns[1] = 222; ns[2] = 333; } int main() { int i, nums[MAX]; memset(nums, 0, sizeof(nums)); change((int**) &nums); for (i = 0; i < MAX; i++) printf("nums[%d] = %d\n", i, nums[i]); return 0; } 

Linux 32位(x86):

 $ uname -a Linux host-1549776 3.2.0-58-generic-pae #88-Ubuntu SMP Tue Dec 3 18:00:02 UTC 2013 i686 i686 i386 GNU/Linux $ gcc inta.c -o inta $ ./inta nums[0] = 111 nums[1] = 222 nums[2] = 333 nums[3] = 0 nums[4] = 0 

Linux 64位(x86_64):

 $ uname -a Linux host-1530141 2.6.32-504.12.2.el6.x86_64 #1 SMP Wed Mar 11 22:03:14 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux $ gcc inta.c -o inta $ ./inta nums[0] = 111 nums[1] = 0 nums[2] = 222 nums[3] = 0 nums[4] = 333 

我读过的C中的整数指针是32位的4个字节长度和64位的8个字节,但我无法弄清楚如何解决这个问题,以使其成为一个可移植的代码,无论架构如何。

任何build议?

一个好的调试器将帮助您找到编译时错误和警告,以解决简单问题,比如您在代码中的问题。 例如:

当我试图在开启所有警告(CLANG)的情况下进行编译时,问题清楚地显示在警告中:

 play_6.c - 5 warnings 5,9 warning: incompatible integer to pointer conversion assigning to 'int *' from 'int'[-Wpointer-int-conv] 6,9 warning: incompatible integer to pointer conversion assigning to 'int *' from 'int'[-Wpointer-int-conv] 7,9 warning: incompatible integer to pointer conversion assigning to 'int *' from 'int'[-Wpointer-int-conv] 8,1 warning: function does not return a value [-Wreturn-type] 10,5 warning: function declaration isnt a prototype. [-Wstrict-prototypes] 

您正在尝试非法指针转换

 int change(int** ns) { ns[0] = 111; //here ns[1] = 222; //here ns[2] = 333; //here return 0; //add return statement here } 

为了解决这些问题
主要改变这一行:

 change((int**) &nums);//nums is already a pointer, no need to dereference //and casting to int ** is also a problem 

 change( nums); 

然后从以下位置更改原型:

 int change(int** ns) { 

至:

 int change(int* ns) { 

接下来 ,向change函数添加一个return语句。
注意 :在你的函数定义中:

 int change(int* ns); 

第一个int表示你想让函数返回一个int值。 如果您想要使用该功能而不需要返回,请将其创建为:

 void change(int *ns); 

最后 ,当我运行你的代码时,在32位或者64位的目标中,结果是一样的:

 nums[0] = 111 nums[1] = 222 nums[2] = 333 nums[3] = 0 nums[4] = 0 

这是你的工作代码:

 #define MAX 5 int change(int ns[]) { ns[0] = 111; ns[1] = 222; ns[2] = 333; } int main() { int i, nums[MAX]; memset(nums, 0, sizeof(nums)); change(nums); for (i = 0; i < MAX; i++) printf("nums[%d] = %d\n", i, nums[i]); return 0; } 

你不需要传递(int**) &numschange因为数组已经通过引用传递。