当我尝试使用函数scanf为动态数组赋值时,我会在第一次分配后得到此错误“Signal received:SIGSEGV(Segmentation fault)”,但是当我使用cin时,它可以工作并且所有值都正确分配。为什么?我的代码中存在问题吗?
int main(int argc, char** argv) {
int r = 5;
short* pole[r];
for(int x = 0;x<r;x++){
pole[x] = new short[r];
for(int y = 0;y<r;y++){
scanf("%d",pole[x][y]); //error
//cin >> pole[x][y]; //OK
}
}
}
答案 0 :(得分:4)
您错过了&符号,%d
应该是%hd
(short int
):
scanf("%hd",&pole[x][y]);
您的原始版本传递了pole[x][y]
的值,而scanf()
需要指针。此外,类型说明符(%d
)对于&pole[x][y]
的类型是错误的。
答案 1 :(得分:3)
你应该使用
scanf("%d",&pole[x][y]);
as scanf()期望变量的地址写入。
另请注意,您使用的是一些短片,但是您正在阅读整数。请改用%hd。
答案 2 :(得分:1)
如果你想知道它为什么要编译,那是因为scanf完全是非类型安全的,因为在第一个参数之后它需要一个变量参数列表(...)。
这意味着你可以传递任何你想要的东西,它只是“希望最好”,这是你想要的。
它应该是一个指针,但它将从堆栈中滚动4或8个字节,其中的任何内容将被视为指针,它将尝试从中读取。
鉴于这是C ++(你使用new而不是malloc),我建议你使用C ++库而不是使用scanf。优选使用向量而不是数组。如果需要矩阵,请使用矩阵类,并且可以使用iostream或类似函数执行输入数据读取。
答案 3 :(得分:0)
当然,您遇到了分段错误。 scanf()
要求您输入指向变量的指针,并传递值。
scanf("%d",&pole[x][y]);