可以将指针数组作为 'int' 参数传递给函数,将地址转换为整数吗?
Can passing an array of pointers to a function as an 'int' parameter convert the addresses to integers?
初学者 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)
击中了我,这让我想知道函数是否试图分配指向地址 48782346 的指针 B[0]
。
函数是否可以将地址转换为整数值?
如果我的问题不清楚或冗长,我深表歉意,第一次提问。感谢您的编辑。
如果取消引用 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];
,它的有效索引从 0
到 size - 1
。所以,int *B[81];
意味着 B[81]
无效。
您传递了错误的参数。您正试图传入一个不存在的数组对象 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
}
初学者 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)
击中了我,这让我想知道函数是否试图分配指向地址 48782346 的指针 B[0]
。
函数是否可以将地址转换为整数值?
如果我的问题不清楚或冗长,我深表歉意,第一次提问。感谢您的编辑。
如果取消引用 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];
,它的有效索引从 0
到 size - 1
。所以,int *B[81];
意味着 B[81]
无效。
您传递了错误的参数。您正试图传入一个不存在的数组对象 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
}