2014-01-14 55 views
0

该程序需要简单地从键盘填充动态分配的矩阵。 我必须补充说我包括在内。我正在研究C++编译器,因此我必须将这些转换添加到malloc中。它似乎有这样的错误:“ConsoleApplication42.exe中的0x0F92FB53(msvcr120d.dll)未处理的异常: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

一开始你永远不要检查你的任何malloc工作 – 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循环头后面有一个额外的分号!

+0

well spotted sir – pm100

+0

这意味着你正在执行'a [n] = ...',这显然是一个内存访问冲突。 –

+0

Awwwwwww。虽然很难找到。 – haccks