Изменение статического массива - PullRequest
3 голосов
/ 30 августа 2010

У меня есть статическая переменная, объявленная в файле:

static char *msgToUser[] = {
    "MSG1                ", 
    "MSG2                ",
};

Внутри одного из методов класса я делаю это:

void InfoUser::ModifyMsg( BYTE msgIdx, char *msgString ){
    strncpy( msgToUser[ idx ], msgString, DISPLAY_SIZE );
}

Когда я выполняю strncopyпрограмма вылетает.Я не уверен, что я делаю не так

Ответы [ 4 ]

6 голосов
/ 30 августа 2010

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

Если вы хотите изменить их, вы можете использовать явное выделение массива:

// Note: The space padding isn't needed if all you require is that the string
// be able to hold DISPLAY_SIZE characters (incl the null terminator)
static char str_1[DISPLAY_SIZE] = "MSG1                ";
static char str_2[DISPLAY_SIZE] = "MSG1                ";
static char *msgToUser[] = { str_1, str_2 };
2 голосов
/ 30 августа 2010

См. C-FAQ. Вопрос 1.32

0 голосов
/ 30 августа 2010

Вы определили msgToUser как вектор символов-указателей.Эти символьные указатели указывают на строки (символьные массивы), которые хранятся в памяти, помеченной как доступная только для чтения (в Microsoft Visual Studio вы можете изменить это с помощью параметра компилятора).

Следовательно, если вы изменитев этой памяти процессор выдаст исключение (вы пытаетесь записать в постоянную память), и ваше приложение будет аварийно завершено.

0 голосов
/ 30 августа 2010

Вместо того чтобы хранить ваш массив как массив указателей, сделайте его двумерным массивом символов, который будет выделять пространство.

Теперь, так как это массив char * и инициализация происходит с использованиемстроковые литералы, при попытке перезаписи памяти только для чтения строковых литералов происходит сбой.

...