我错过了什么?如果我想在一个单独的函数中增加一个计数器,为什么它会给我一个分段错误?
int point(int *cow);
int main()
{
int *cow = 0;
point(cow);
return(0);
}
int point(int *cow) {
(*cow)++;
return(0);
}
答案 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;
当程序试图访问上面指出的内存时,您会收到分段错误,因为它不是有效地址。