动态分配矩阵不允许输入

时间:2014-01-14 23:00:18

标签: c input matrix dynamically-generated

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

}

2 个答案:

答案 0 :(得分:4)

在第一个for循环标题之后你有一个额外的分号!

答案 1 :(得分: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