Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言代码:64位系统中int数组函数参数的问题_C_Arrays_Linux_Pointers_64 Bit - Fatal编程技术网

C语言代码:64位系统中int数组函数参数的问题

C语言代码:64位系统中int数组函数参数的问题,c,arrays,linux,pointers,64-bit,C,Arrays,Linux,Pointers,64 Bit,以下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++)

以下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 64位(x86_64):

我已经读到C中的整数指针在32位中有4字节长,在64位中有8字节长,但是我不知道如何解决这个问题,以便使它成为一个可移植的代码,而不管它的体系结构如何


有什么建议吗?

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

当我试图在打开所有警告(叮当声)的情况下编译此文件时,问题清楚地显示在警告中:

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
}
解决这些问题
在main中更改此行:

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); 
第一个
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;
}
#定义最大值5
整数变化(整数ns[]
{
ns[0]=111;
ns[1]=222;
ns[2]=333;
}
int main()
{
int i,nums[MAX];
memset(nums,0,sizeof(nums));
变更(nums);
对于(i=0;i

您不需要将
(int**)&nums
传递到
change
,因为数组已经通过引用传递了。

这件事应该做什么?为什么将“NUM”的成员视为指针而不是指针?是否可以将
clang
警告添加为文本?我的公司老板不允许我访问
imgur
@PeterM-我不确定我是否遵守了你的要求。什么是
imgur
?本质上,文本是:警告:不兼容的整数到指针转换:从int[W-pointer-int-conv]分配给int**。同一文本重复三次,每次出现一次。以及类似的警告,没有原型,没有使用return语句。(两个相关)Stackoverflow在
i.stack.imgur.com
上承载图像,而站点就是在这里承载您的
clang
图像的。虽然我的公司霸主允许访问
stackoverflow.com
,但我在
imgur.com
域上看不到任何内容。所以对于你的形象,我看到的只是一个断开的链接。这真的是我的问题,不是你的问题,但我相信其他人也有同样的想法,而且谷歌无法将警告编入索引。@chux-谢谢。我删除了多余的图片并编辑了OCR文本版本。@chux-我一直认为你的评论是积极和有用的。谢谢。谢谢你们的快速回答!我没有意识到数组已经通过引用传递了。它在两个平台上都像预期的那样工作。
void change(int *ns);
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;
}