【问题标题】:Can passing an array of pointers to a function as an 'int' parameter convert the addresses to integers?可以将指针数组作为“int”参数传递给函数将地址转换为整数吗?
【发布时间】:2015-11-21 23:22:41
【问题描述】:

初级 c++ 程序员,编写代码来解决数独难题。为了避免混淆,我会尽量简短地介绍背景信息。

我有一个指针数组int *P[9],我为每个条目分配了一个特定的地址。我想将这些地址分配给另一个指针数组int *B[81]

P[0]应该对应B[0]P[1]对应B[8]等等。

当我将这些传递给函数时:

void (int B[  ], int P[  ] ) {...}

该函数似乎正在将地址P[ ] 指向的地址转换为整数值。在调用函数之前P[0] 指向地址0x7fff978d46b0,如果我检查函数内部P[0] 的值,它是一个类似于`48782346 的数字。

#include<iostream>
using namespace std;

void assign_box(int matrix[], int P[])
{
    cout << "P[0] in function: " << P[0] << "\n";
    matrix[0]=P[0];
}

int main()
{
    int table[9][9];
    //Initialise table entries to 0
    for(int i=0; i<9; i++)
    {
        for(int j=0; j<9; j++)
        {
            table[i][j]=0;
        }
    }
    //Assign addresses to vector P, for brevity P is of length one
    int *P[1];
    P[0]=&table[0][0];

    cout<< "P[0] before function: " << P[0] << "\n";

    int*B[81];
    assign_box(B[81], P[9]);
}

如果它这样做并且有效,我不会在意,但不幸的是,当我分配 B[0] = P[0] 时,它给我一个 Segmentation fault (core dumped),这让我想知道该函数试图将指针 B[0] 分配给地址48782346。

函数是否可以将地址转换为整数值?

抱歉,如果我的问题不清楚或冗长,第一次提问。并感谢您的编辑。

【问题讨论】:

  • 我不清楚这些数组是int 还是int*,还是两者的某种组合。
  • 数组都是 int*,正如我初始化为:int*B[81]
  • 那为什么你的函数使用int 数组呢? void (int B[ ], int P[ ] )
  • 如果我没有类型,我的编译器告诉我变量是'declared void',如果我使用'void(* B[],*P[])'它告诉我B和P不是在此范围内声明

标签: c++ pointers parameters type-conversion


【解决方案1】:

如果您取消引用int*[](或int**),您将获得int*。如果取消引用 int*,则会得到 int。这正是您正在做的事情,以及为什么您最终会得到 int

//main
int *P[1]; //Array of pointers to int
int *B[81]; //Array of pointer to int
assign_box(B[81], P[9]); //Pass in two pointers to int

//assign_box
matrix[0]=P[0]; //assign int to int

您可能打算像assign_box(B, P) 一样调用assign_box,并让签名为void assign_box(int *B[], int *P[]);。然后,这将允许您将数组中的一个指针分配给数组中的另一个指针。

有多种因素可能导致分段错误,但它们都源于无效的数组索引。如果数组声明为type identifier[size];,则它具有从0size - 1 的有效索引。所以,int *B[81]; 表示B[81] 无效。

【讨论】:

  • 非常感谢您的帮助,这解决了我所有的问题。调用B[81] 是主要问题,事后看来,这是一个相当愚蠢的错误。感谢您的快速反馈。
【解决方案2】:

您传递了错误的参数。您试图传入一个不存在的数组对象 B[81]。你只有 B[0] - B[80]。此外, B[80] 不是 int 指针。它是 int 数组中的 int。 P[9] 是一个指向整数数组的指针。因此,您尝试将不存在的数组槽中的整数传递给不接受整数的参数——它接受整数数组。

#include<iostream>
using namespace std;

void assign_box(int matrix[], int P[])
{
    cout << "P[0] in function: " << P[0] << "\n";
    matrix[0]=P[0];
}

int main()
{
    int table[9][9];
    //Initialise table entries to 0
    for(int i=0; i<9; i++)
    {
        for(int j=0; j<9; j++)
        {
            table[i][j]=0;
        }
    }
    //Assign addresses to vector P, for brevity P is of length one
    int *P[1];
    P[0]=&table[0][0];

    cout<< "P[0] before function: " << P[0] << "\n";

    int*B[81];
    assign_box(B[81], P[9]); // WRONG

}

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    相关资源
    最近更新 更多