0

What am I missing? If I want to increment a counter in a separate function, why does it give me a segmentation fault?

int point(int *cow);

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

}

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

5 回答 5

4

Dereferencing a null pointer is undefined behavior in C.

Maybe you wanted to do this instead:

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

point(cow);

Note that the temporary pointer cow is not necessary and you can directly pass &a to point function.

于 2012-11-22T23:03:14.600 回答
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 中有一个指针,只需将指针传递给您的增量函数。

于 2012-11-22T23:05:53.353 回答
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);
}

祝你好运!

于 2012-11-22T23:05:54.257 回答
1
int *cow = 0;

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

试试这个:

int x = 0;
int *cow = &x;
point(cow);
于 2012-11-22T23:06:54.600 回答
0

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

int *cow = 0;

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

于 2012-11-22T23:09:08.370 回答