Rod*_*ort 2 c linux arrays 64-bit pointers
以下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;
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我已经读过C中的整数指针在32位中是4个字节长,在64位中是8个字节,但我无法弄清楚如何解决这个问题,以使其成为可移植代码,无论架构如何.
有什么建议吗?
一个好的调试器将帮助您找到简单问题的编译时错误和警告,例如代码中的问题.例如:
当我尝试在打开所有警告(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]
Run Code Online (Sandbox Code Playgroud)
您正在尝试非法指针转换
int change(int** ns) {
ns[0] = 111; //here
ns[1] = 222; //here
ns[2] = 333; //here
return 0; //add return statement here
}
Run Code Online (Sandbox Code Playgroud)
要解决这些问题:
在main中更改以下行:
change((int**) &nums);//nums is already a pointer, no need to dereference
//and casting to int ** is also a problem
Run Code Online (Sandbox Code Playgroud)
至
change( nums);
Run Code Online (Sandbox Code Playgroud)
并从以下位置更改原型:
int change(int** ns) {
Run Code Online (Sandbox Code Playgroud)
至:
int change(int* ns) {
Run Code Online (Sandbox Code Playgroud)
接下来,向change函数添加一个return语句.
注意:在您的函数定义中:
int change(int* ns);
Run Code Online (Sandbox Code Playgroud)
第一个int说你希望函数返回一个int值.如果要在不需要返回的情况下使用该函数,请将其创建为:
void change(int *ns);
Run Code Online (Sandbox Code Playgroud)
最后,当我使用上面的更改运行代码时,在32位或64位目标中,结果是相同的:
nums[0] = 111
nums[1] = 222
nums[2] = 333
nums[3] = 0
nums[4] = 0
Run Code Online (Sandbox Code Playgroud)