可以将一个指针数组作为'int'参数传递给函数,将地址转换为整数?

时间:2015-11-21 23:22:41

标签: c++ pointers parameters type-conversion

初学者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)命中我,这让我想知道是函数试图分配指针{ {1}}到地址48782346.

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

道歉,如果我的问题不清楚或冗长,第一次提问者。谢谢你的编辑。

2 个答案:

答案 0 :(得分:2)

如果您取消引用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

您可能打算将assign_box(B, P)称为void assign_box(int *B[], int *P[]);,并将签名设为type identifier[size];。这将允许您将数组内的一个指针分配给数组中的另一个指针。

有很多事情可能导致分段错误,但它们都源于无效的数组索引。如果数组声明为0,则它具有从size - 1int *B[81];的有效索引。因此,B[81]表示angular.module('app').directive("passwordConfirm", function() { "use strict"; return { require : "ngModel", restrict : "A", scope : { //We will be checking that our input is equals to this expression passwordConfirm : '&' }, link : function(scope, element, attrs, ctrl) { //The actual validation function passwordConfirmValidator(modelValue, viewValue) { return modelValue == scope.passwordConfirm(); } //Register the validaton when this input changes ctrl.$validators.passwordConfirm = passwordConfirmValidator; //Also validate when the expression changes scope.$watch(scope.passwordConfirm, ctrl.$validate); } }; }); 无效。

答案 1 :(得分:0)

你传递了错误的参数。你试图传入一个不存在的数组对象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

}