C strcpy = необработанное исключение: адрес записи нарушения прав доступа 0x00000000

У меня проблема с функцией strcpy. Использование C. Основной смысл этого простого кода (ниже) — копирование строки из массива в массив указателей.

char string[20] = "ABCDEFGH\0";
char * array_of_pointers[20];

// now I want to copy string to the first available slot;

strcpy(array_of_pointers[0],string);

Затем strcpy выдает мне ошибку:

Unhandled exception: Access violation writing location 0x00000000.

Почему? Я знаю, что эта проблема, вероятно, проста, но я действительно понятия не имею.


person krzakov    schedule 08.12.2012    source источник


Ответы (2)


Целевой буфер не был инициализирован. array_of_pointers[0] — это просто указатель, который (в данном случае на основе информации об ошибке из нарушения прав доступа) указывает на адрес 0. Его необходимо инициализировать. Возможно:

array_of_pointers[0] = malloc( strlen( string ) + 1 );

array_of_pointers — это массив из 20 указателей. Таким образом, каждая запись в этом массиве должна быть инициализирована, прежде чем ее можно будет использовать. Помните также, что если вы используете malloc (или, возможно, strdup) для выделения памяти, используйте free для освобождения памяти.

person Mark Wilkins    schedule 08.12.2012
comment
Я не могу этого сделать. array_of_pointers[0] = malloc(strlen(string) + 1); Visual говорит: значение типа void * не может быть присвоено объекту типа char * - person krzakov; 08.12.2012
comment
Похоже, вы можете компилировать его как файл С++. Если это так, то вам нужно разыграть его: array_of_pointers[0] = (char*)malloc(...) - person Mark Wilkins; 08.12.2012
comment
Ok. Дело решено. Я думал, что определение обеспечивает инициализацию. - person krzakov; 08.12.2012

Вам нужно инициализировать array_of_pointers :

array_of_pointers[0] = malloc(strlen(string)+1);

Или лучше всего:

array_of_pointers[0] = strdup(string);
person AgA    schedule 08.12.2012
comment
Я не могу этого сделать. array_of_pointers[0] = malloc(strlen(string) + 1); Visual говорит: значение типа void * не может быть присвоено объекту типа char * - person krzakov; 08.12.2012
comment
Решение strdup будет скомпилировано. Но если вы хотите вызвать malloc напрямую, вам нужно привести возвращаемое значение malloc к a ( char * ) . Кроме того, поскольку теперь вы используете пространство кучи, а не пространство стека, не забудьте проверить наличие ошибок нехватки места в куче. - person AlgebraWinter; 08.12.2012