2014-09-22 2 views
-6

Я использую 64-разрядную машину linux, поэтому размер моих указателей составляет 8 байтов. Поэтому, глядя на приведенный ниже код, я написал программу ниже segfault сразу после H в моей строке (в strcpy()). Но похоже, что этого не происходит. с приведенной ниже программой я думал, что это наполнит и испортит память в x. Эта ниже программа работает нормально в моей системе, но если я добавлю другую букву в strcpy(), она будет segfaults. Таким образом, такая проблема, очевидно, зависит от системы, но как эта строка не сбой программы? Я искал такую ​​проблему, если некоторые ссылки присутствуют, вы также можете перенаправить меня. Заранее спасибо.Как обрабатываются строки в C?

int main() 
{ 

int x; 
char* c ; 

x = 0xF0000000; 

strcpy(&c,"ABCDEFGHFFFFFF"); 
x++; 
printf("%X\n",x); 

printf("%s\n",&c); 

}

+4

Я вижу, что вы указали указатель ... но на что это указывает? –

+0

Конечно его будет компилировать с предупреждениями, но это не дает мне результат, как следующий 'F0000001 ABCDEFGHFFFFFF' я теперь это, безусловно, как вы пишете обычные программы, которые я просто пытаюсь увидеть, как строки копируются и вам у парней определенно нет ответа. –

+0

Ваша программа просто UB, нет ничего полезного в споре. Если вы хотите узнать, что именно делает ваш случай в конкретном прогоне, отломите отладчик и выполните однократную операцию. Имейте в виду, что использование отладчика может изменить поведение программ. – Deduplicator

ответ

0

Как указателей и управление памятью в C:

  • вы должны создать указатель вручную
  • вы должны выделять память вручную
  • вы должны инициализировать указатель указывает на выделенную память вручную

Выражение

char *c; 

только не создает указатель, но она также не выделять какой-либо памяти для символов, а также не инициализировать указатель на выделенную память.

Ты гораздо лучше с:

char c[20]; 

c будет вести себя как указатель, но в то же время вы выделили 20-байтовый буфер (в main «s кадр стека) и c указывает на его начало.

При использовании строки (указатель на символ), вы не strcpy в адрес указателя, но по адресу, проведенного указатель:

strcpy(c, "ABCDEFGHFFFFFF"); 

Так же, как примечание стороны: выражение "ABCDEFGHFFFFFF" выделяет постоянный буфер символов с буквальным текстом и завершающий нуль в памяти и возвращает его адрес. Вот почему такое использование является законным.