Правильность указателя в конструкции цикла? - PullRequest
2 голосов
/ 22 июля 2011

Что ж, я искал все и ничего не смог найти, поэтому, извините, если этот вопрос уже задавался.

В C (gcc, Linux x86_64), пытаюсь проверить указатель с помощью этого кодаработает:

if(ptr) { ... }

Но я получаю segfault, когда я делаю это:

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 ]

4 голосов
/ 22 июля 2011

Я думаю, вы неправильно понимаете, что означает "проверка указателя". Условие if(p) идентично if(p != 0), поэтому all , которое вы проверяете, указывает, является ли указатель нулевым или нет. Существует Ничего , которое говорит вам, можно ли разыменовывать любой данный указатель.

В частности, for(; ptr; ptr++) { ... } будет просто продолжать увеличивать указатель вечно; если вы разыменуете ptr в теле, вы почти наверняка вызовете нарушение доступа.

Вы сами ответственны за то, насколько точно вы можете увеличить указатель!

(Глупо в сторону: если вы вообще не разыменовываете ptr, это может повторяться до тех пор, пока ptr не переполнится и снова не станет равным 0, но это может никогда не произойти в зависимости от начального значения ptr и sizeof(*ptr).) * * тысяча двадцать-один

1 голос
/ 22 июля 2011

я бы предположил, что ptr не равно нулю (поэтому if будет иметь значение true), но ваш указатель недействителен (то есть: он был освобожден, или даже если ptr = 1, "if" будет иметь значение true, но вы не будете быть в состоянии получить доступ к позиции памяти 1)

возможно, вы можете попробовать fprintf (stdout, "% p", ptr) в разных частях вашего кода, чтобы вы могли отследить, где значение было испорчено, нам действительно нужно больше подробностей здесь:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...