c ++ scanf导致SIGSEGV

时间:2012-02-01 15:57:21

标签: c++ scanf

当我尝试使用函数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
    }
}

}

4 个答案:

答案 0 :(得分:4)

您错过了&符号,%d应该是%hdshort 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]);