分段错误,增加指针中的值

时间:2012-11-22 23:02:36

标签: c pointers segmentation-fault fault

我错过了什么?如果我想在一个单独的函数中增加一个计数器,为什么它会给我一个分段错误?

int point(int *cow);

int main()
{
    int *cow = 0;
    point(cow);
    return(0);

}

int point(int *cow) {
    (*cow)++;
    return(0);
}

5 个答案:

答案 0 :(得分:4)

取消引用空指针是C中未定义的行为。

也许你想这样做:

int a = 0;
int *cow = &a;

point(cow);

请注意,临时指针cow不是必需的,您可以直接将&a传递给point函数。

答案 1 :(得分:2)

执行此操作的好方法如下:

void point (int *cow);

int main () {
    int cow = 0; // Create a simple int, not a pointer
    point (&cow); // Pass address (&) of your int
    return 0;
}

void point (int *cow) {
    (*cow)++;
}

您不需要在main中使用指针,只需将指针传递给增量函数即可。

答案 2 :(得分:1)

您正在尝试取消引用空指针,这肯定会导致程序崩溃。你可能打算这样做:

int point(int *cow);

int main()
{
    int cow = 0;
    point(&cow);
    return(0);

}

int point(int *cow) {
    (*cow)++;
    return(0);
}

在原始代码中,您创建了一个指向int的指针(即:int * cow),但您实际上从未创建过一个int来存储您尝试递增的值。以下是将上面的代码更改与原始代码组合在一起的有效示例:

int point(int *cow);

int main()
{
    int cow = 0;
    int* pCow = &cow;
    point(pCow);
    return(0);

}

int point(int *cow) {
    (*cow)++;
    return(0);
}
祝你好运!

答案 3 :(得分:1)

int *cow = 0;

将“cow”声明为指向整数的指针,然后将该指针赋值为零。然后将它传递给point(),它尝试取消引用“0”,然后递增存储在该内存位置的任何值。

请改为尝试:

int x = 0;
int *cow = &x;
point(cow);

答案 4 :(得分:0)

(来自wiki的定义)分段错误(通常缩写为段错误),总线错误或访问冲突通常是尝试访问CPU无法物理寻址的内存。

int *cow = 0;

当程序试图访问上面指出的内存时,您会收到分段错误,因为它不是有效地址。