2014-01-14 2 views
0

Программе необходимо просто заполнить с клавиатуры динамически распределяемую матрицу. Я должен добавить, что я включил. Я работаю над компилятором на C++, поэтому мне нужно добавить трансляцию в malloc. Кажется, что эта ошибка: «Необработанное исключение в 0x0F92FB53 (msvcr120d.dll) в ConsoleApplication42.exe: 0xC0000005: место для обнаружения нарушения доступа 0xCDCDCDCD." достигая команды gets (a [i]). После отладки, похоже, также есть очень подходящий прорыв в свободной последовательности.Динамически распределенная матрица, не допускающая ввода

int main() 
{ 
    int n, i; 
    char **a; 
    printf("introduceti numarul de cuvinte:\n"); 
    scanf("%d", &n); 
    a = (char**)malloc(n*sizeof(char*)); 
    if (!a) 
     printf("alocare nereusita"); 

    for (i = 0; i < n; i++); 
    { 
     a[i] = (char*)malloc(56 * sizeof(char)); 
    } 
    for (i = 0; i < n; i++) 
    { 
     printf("introduceti urmatorul cuvant:\n"); 
     gets(a[i]); 
    } 
    for (i = 0; i < n; i++) 
     free(a[i]); 
    free(a); 
    return 0; 

} 
+0

для начала вы никогда не проверяйте, что какой-либо из ваших mallocs работает – pm100

ответ

0

Ответ правильный.

Из-за дополнительных ; вы выполняете a[n] = ..., что, очевидно, является нарушением прав доступа к памяти.

Кроме того, если пользователь вводит более 55 символов, ваш код еще будет выполнять другой нарушение доступа к памяти. Поэтому, рекомендуя заменить gets(a[i]) со следующим фрагментом кода:

#include <conio.h> 

#define MAX_SIZE  (56-1) 
#define ALLOWED_CHAR(c) (32 <= (c) && (c) <= 255) 

int j = 0; 

while (1) 
{ 
    int c = _getch(); 
    if (j < MAX_SIZE && ALLOWED_CHAR(c)) 
    { 
     a[i][j++] = (char)c; 
     printf("%c",(char)c); 
    } 
    else if (j > 0 && c == '\b') 
    { 
     j--; 
     printf("\b \b"); 
    } 
    else if (j > 0 && (c == '\r' || c == '\n')) 
    { 
     a[i][j] = 0; 
     break; 
    } 
} 

Вы можете переопределить ALLOWED_CHAR, если вы хотите, чтобы ограничить пользовательский ввод, например:

#define ALLOWED_CHAR(c) ('0' <= (c) && (c) <= '9') // only digits 
#define ALLOWED_CHAR(c) ('A' <= (c) && (c) <= 'Z') // only capital letters 
4

У вас есть дополнительная точка с запятой после первого заголовка for-loop!

+0

хорошо замеченный сэр – pm100

+0

, что означает, что вы выполняете 'a [n] = ...', что, очевидно, является нарушением доступа к памяти. –

+0

Awwwwwww. Трудно найти. – haccks

Смежные вопросы