循环结构中的指针有效性?

时间:2011-07-22 14:02:24

标签: c pointers

好吧,我已经搜遍过所有的搜索结果,所以请原谅这个问题是否有问题。

在C(gcc,Linux x86_64)中,尝试使用此代码测试指针有效:

if(ptr) { ... }

但是当我这样做时,我得到了一个段错误:

while(set1) {
    n++;
    set3 = realloc(set3, sizeof(int) * n);
    set3[n-1] = *set1;
}

甚至是这样:

  for(; set1; set1++) {
    n++;
    set3 = realloc(set3, sizeof(int) * n);
    set3[n-1] = *set1;
    set1++;
  }

有人可以解释一下吗?我哪里错了? :S

注意:上面提到的`if'里面的代码只是用于测试,我实际上并不需要它

2 个答案:

答案 0 :(得分:4)

我认为你误解了“测试指针”的含义。条件if(p)if(p != 0)相同,因此您正在测试的所有指针是否为空。 nothing 告诉您是否可以取消引用任何指定的指针。

特别是,for(; ptr; ptr++) { ... }将继续永久递增指针;如果你在体内取消引用ptr,你几乎肯定会最终导致访问冲突。

你自己负责知道你可以增加多少指针!

(撇开:如果你根本没有取消引用ptr,这可能会循环直到ptr溢出并再次为0,但这可能永远不会发生,具体取决于{{1的初始值}和ptr。)

答案 1 :(得分:1)

我猜ptr不为空(所以if会评估为true)但你的指针无效(即:它被释放,或者即使ptr = 1,“if”将评估为true但你不会能够访问记忆位置1)

也许你可以在你的代码的不同部分尝试fprintf(stdout,“%p”,ptr),这样你就可以追踪价值被搞砸的地方,我们真的需要更多细节:)