2013-12-02 2 views
0

Это может быть более глубокий вопрос, чем я ожидаю, но можете ли вы видеть, не указана ли указатель на символ? Например, строка, нераспределенные не NULL, как видно из когда я побежал этот код:Проверьте, не была ли строка нераспределенной.

char *ptr; /* Unallocated char pointer */ 
if (ptr == NULL) { 
     ptr = malloc(10); /* Not casted cause it doesn't matter */ 
     printf("ptr is allocated\n"); 
     return(0); 
} 
printf("ptr is unallocated\n"); 
return(0); 

Когда я запускал код, я получил сообщение ptr is unallocated. Это имеет смысл, потому что строка не может иметь память для нулевого символа. Итак, есть ли способ увидеть, что строка нераспределена? Или я задаю неправильный вопрос?

ответ

4

Нет, это невозможно. В вашем случае ptr является uninitialised, что означает, что он может содержать любое значение, пока вы в первый раз не присвоите ему что-либо. Это может быть NULL, иначе это может быть не так.

+0

Итак, если бы я передавал строки функциям, и мне нужно было бы инициализировать их до «NULL» во всех случаях? – trifork

+0

Да, вы всегда должны инициализировать локальные переменные. В противном случае вы не можете делать какие-либо предположения о том, что они могут быть. –

+0

@Trifork: да, если вы хотите, чтобы ваша программа вела себя правильно. –

2

Это потому, что вы определили ptr, но не инициализировали его. Попробуйте следующее:

char *ptr = NULL; 

Это хороший стиль кодирования для инициализации указателя на нулевой указатель в целом; очень важно, если вы хотите проверить, инициализирована ли она некоторой допустимой строкой.

+0

Указывает ли параметр 'ptr' на' NULL' символ null, или это просто приемлемая форма инициализации? Вы могли бы использовать 'malloc()' впоследствии, чтобы выделить его, или 'realloc()'? – trifork

+0

Нет; установка 'ptr' в' NULL' означает, что 'ptr' указывает на отсутствие адреса памяти. Затем вы должны называть 'ptr = malloc (1); * ptr = '\ 0'; 'положить нулевой символ в местоположении, на которое указывает' ptr' – mfabel

2

Невозможно сделать это без предоставления начального значения, поскольку неинтеллизированные автоматические переменные будут иметь неопределенное значение . Они должны быть инициализированы; в противном случае невозможно определить начальное значение автоматических переменных. Фактически использование неинициализированной переменной - undefined behavior.

Проект стандарта C99 говорится в разделе 6.7.8инициализации пункт говорит:

Если объект, который имеет автоматическую продолжительность хранения не инициализирована явно, его значение является неопределенным. [...]

и Приложение J.2Неопределенное поведение пункт говорит:

поведение не определено в следующих случаях:

и включает в себя следующую пулю :

Значение объекта с автоматической продолжительностью хранения используется, когда оно равно неопределенным (6.2.4, 6.7.8, 6.8).

+0

Я вижу, поэтому я никогда не могу использовать неинициализированные переменные в любом случае. – trifork

+0

@Trifork вы никогда не должны использовать значение неинтеллизированной переменной, это неопределенное поведение, что означает, что ваша программа может буквально что-либо делать, хотя обычно результаты - это поведение, которое выглядит нормально, но может сломаться в любое время или в какой-то аварии. Ссылка, которую я предоставил, должна быть полезна. –

Смежные вопросы