c указатель на символ сравнения - PullRequest
0 голосов
/ 29 марта 2012
struct list{
   char *Name;
};

void chekFC(struct list *newList){
  char *fC = newList->Name;
  printf("%s\n", &fC);                   //I can print it
  if(fC[0] == '+')                       //Any error??
  printf("Yes");
}

int main(){
   struct list *newList = (struct list *)malloc(sizeof(struct list));
   newList->Name = "+abc";
   chekFC(newList);
}

он может работать, если я изменю код на следующий

void chekFC(struct list *newList){
  char *fC = newList->Name;
  printf("%s\n", &fC);                   //I can print it
  if(fC[0] == '+')  {}                     // Add {}  nothing run in the if condition, than the program can run
  printf("Yes");
}

Почему эта программа не может быть запущена?Ошибка: ошибка сегментации (ядро сброшено)

Ответы [ 5 ]

1 голос
/ 29 марта 2012

в вашем коде есть одна проблема.

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

вы должны изменить его на

printf("%s\n", fC);

Я думаю, вы не очень хорошо понимаете указатель C.& fC очень отличается от fC, вы можете распечатать его как "% p", чтобы увидеть его.

printf("fC %p, &fC %p\n", fC, &fC);

& fC - это адрес fC, fC - это адрес строки "+ abc".Я хочу, чтобы это помогло вам, но я предлагаю вам прочитать какую-нибудь книгу, чтобы выучить указатель C.

1 голос
/ 29 марта 2012

newList-> имя никогда не выделялось.

1 голос
/ 29 марта 2012

Чтобы последовательно избежать подобных проблем в будущем, я рекомендую использовать утверждения:

assert(newList);
assert(newList->Name);
1 голос
/ 29 марта 2012

Вы уверены, что newList->Name выделено?

0 голосов
/ 29 марта 2012
printf("%s\n", &fC);

неправильно, вы, вероятно, имеете в виду

printf("%s\n", fC);
...