Нарушение доступа при назначении нового значения переменной char * - PullRequest
0 голосов
/ 19 апреля 2019

Я тестирую этот следующий код, но когда исполняется, в этой строке появляется AV:

*port = 0;

как это решить?что я делаю не так?

#include "stdafx.h"
#include <windows.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
    char *host = "127.0.0.1:1234";
    char *port = strchr(host, ':');

    if (port)
    {
        *port = 0;
        ++port;
        printf("%s \n", *port);

        int portInt = strtol(port, NULL, 10);

        printf("%d: \n", portInt);
    }

    getchar();

    return 0;
}

Ответы [ 2 ]

3 голосов
/ 19 апреля 2019

Проблема в том, что вы пытаетесь изменить строковый литерал (host). Строковые литералы имеют значение const, поэтому попытка изменить их - неопределенное поведение.

Так как port указывает на один из символов в строковом литерале, попытка изменить это значение следующим образом:

*port = 0;

приводит к неопределенному поведению, в вашем случае к аварийному завершению.

Одно исправление - просто сделать host массивом char:

char host[] = "127.0.0.1:1234";
char *port = strchr(host, ':');

Поскольку объявление было изменено на массив для host, все символы в этом массиве становятся изменяемыми.

0 голосов
/ 19 апреля 2019
char *port = strchr(host, ':');

создает указатель на ':' в строке хоста, и поскольку вы определили буквенную строку,

char *host = "127.0.0.1:1234";`

host является указателем на чтениетолько ячейка памяти и, таким образом,

*port = 0;

фактически пытается записать в строку только для чтения host.

вы можете написать:

int _tmain(int argc, _TCHAR* argv[])
{
  // define a const as const
  const char *host_default = "127.0.0.1:1234";

  // dup host if you want to write in it, or change.
  char *host=strdup(host_default);

  if (!host) exit(-1); // check if memory was allocated!

  // port pointer to `:` in memory of host String
  char *port = strchr(host, ':');

  if (port)
  {
    *port = 0; // have host to be Null terminated
    ++port;
    printf("%s \n", port);

    long portInt = strtol(port, NULL, 10);

    printf("Port: %ld: \n", portInt);
    // I can only assume you also want the hostname, seen the *port = 0;
    printf("HostName: %s: \n", host);
  }
  // free allocated memory;
  free(host);
  // set to NULL, good practise
  host=NULL;
  // set port also to NULL as it might point to released memory of host
  port=NULL;

  getchar();

  return 0;
}
...