Итак, у меня есть две простые программы.Они очень похожи, но один код работает просто отлично, а другой вообще не работает.Кто-нибудь здесь представляет, почему?
Этот код работает без проблем, несмотря на то, что имя char * не инициализируется.
#include <dirent.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
DIR* d;
struct dirent* dir;
char* name;
d=opendir(".");
if(d){
while((dir=readdir(d))!=NULL){
strcpy(name,dir->d_name);
printf("%s\n",name);
}
clode(dir);
}
return 0;
}
Второй код имеет незначительное отличие в разделе объявлений, и это приводит к недоступности переменной name..
int main(int argc, char* argv[]){
DIR* d;
struct dirent* dir;
char* surname = "Surname";
char* name;
d=opendir(".");
if(d){
while((dir=readdir(d))!=NULL){
strcpy(name,dir->d_name);
printf("%s\n",name);
}
clode(dir);
}
return 0;
}
При выполнении второго кода я получаю «Ошибка сегментации» сразу после strcpy(name,dir->d_name)
, и когда я пытаюсь напечатать переменную «name» в отладчике GDB, я получаю сообщение $1 = 0x1 <error: Cannot access memory under address 0x1>
.Почему это сообщение об ошибке не появилось в первой программе?И что за проблема с объявлением char* surname = "Surname";
, приводящим к такого рода ошибкам во время выполнения?
PS Я знаю, что в этом примере я никогда не использую переменную 'фамилия', и я знаю, что strcpy(name,dir->d_name)
не требуетсяв этом коде.Этот код является частью гораздо большего кода, и это является результатом извлечения важных частей, которые вызывают ошибку (в попытке создать более минимальный набор кода).
Спасибо.Привет