c двойной указатель дает ошибку, которая не имеет смысла - PullRequest
0 голосов
/ 28 сентября 2011
int p_entity(char **data){
  char *pch;

  pch = strtok(*data, " \n");
  // printf("%s ", pch);
  pch = strtok(NULL, " \n");
  // (*data) = (*data) + 1;   // 1. this is okay
  //  (*data) = pch;          // 2. but doing this will cause an error
  printf("%c %d \n", *pch, pch); 
  printf("%c %d \n", **data, *data);
}

Из приведенного выше кода я получу следующее, если раскомментирую 1:

g 4927479
e 4927456

Я получу следующее, если раскомментирую 2:

g 4927479
g 4927479
      3 [main] main 8172 exception::handle: Exception: STATUS_ACCESS_VIOLATION
    470 [main] main 8172 open_stackdumpfile: Dumping stack trace to main.exe.stackdump

Может кто-нибудь объяснить, почему я получаю эту ошибку? Я думаю, что оба назначения будут законными, а инкремент (* data) будет эквивалентен прямому назначению адреса, по которому я хочу, чтобы он был.

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Похоже, что даже когда вы получаете сообщение об ошибке (и раскомментируете 2), вы все равно получаете два printfs ... кажется, что это намного позже приводит к сбою в вашем коде.

0 голосов
/ 30 сентября 2011

Ответ на самом деле зависит от того, как вы обрабатываете данные до и после вызова этой функции.

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

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