Инициализация массива символов внутри конструктора (индекс массива выходит за рамки) в C

#c #arrays #constructor #initialization #indexoutofboundsexception

#c #массивы #конструктор #инициализация #исключение indexoutofboundsexception

Вопрос:

Я пытаюсь инициализировать эти два массива символов внутри конструктора. Ошибка связана с массивами символов buf и clientip, с остальными все в порядке. Я добавил код всего конструктора ниже:

 class server : public udp {

public:
    server() {

        clientLength = 0;
        buf[1024] = {};
        bytesIn = 0;
        count = 0;
        clientIp[256] = {};
        portnumber = 0;
    }

private:
    
    int clientLength = sizeof(client);
    char buf[1024];
    int bytesIn;
    int count = 0;
    char clientIp[256];
    unsigned short portnumber = 70000;
  

Предупреждение заключается в том, что:

*(ошибка) Массив ‘buf[1024]’, доступ к которому осуществляется с индексом 1024, который выходит за рамки. [ArrayIndexOutOfBounds]

(ошибка) Массив ‘ClientIP[256]’, доступ к которому осуществляется по индексу 256, который выходит за рамки. [ArrayIndexOutOfBounds]*

Как я могу решить эту проблему?

Комментарии:

1. Это точно говорит вам, в чем проблема: buf[1024] = {}; в вашем конструкторе осуществляется доступ к элементу 1024, который выходит за рамки. Удалите [1024]. А еще лучше, переместите все это в раздел инициализации конструктора или присвоите значения по умолчанию в разделе private.

2. @sweenish Большое спасибо за ваш ответ. Можете ли вы показать мне в коде, что вы имеете в виду для первой части решения

Ответ №1:

buf[1024] = {}; не то, что вы хотите. Он получит доступ к 1024-му элементу buf и по умолчанию инициализирует только этот элемент, но он выходит за рамки.

Чего вы, вероятно, хотите:

 class server : public udp {

public:
    server() : clientLength(), buf(), bytesIn(), count(), clientIp(), portnumber(){
    }
  

Вы всегда должны отдавать предпочтение списку инициализации элемента, когда это возможно.